当前位置: 首页 > 知识库问答 >
问题:

Java 8 collect()only isPresent()可选值[duplicate]

璩涛
2023-03-14

在Java8中有没有更优雅的方法来实际实现这一点呢?

list.stream()
    .map(e -> myclass.returnsOptional(e))
    .filter(Optional::isPresent)
    .map(Optional::get)
    .collect(Collectors.toList());

我说的是筛选器(可选::IsPresent)后跟映射(可选::Get),我想在列表中优雅地收集具有值的可选结果。

共有1个答案

籍弘伟
2023-03-14

在您的情况下,可以使用一个FlatMap,而不是MapFilterMap的组合。为此,最好为创建流定义一个单独的函数:public private static stream createStream(stringe) ,以便在lambda表达式中没有几行代码。

请参阅我的完整演示示例

 public class Demo{
    public static void main(String[] args) {
        List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
        List<Integer> newList = list.stream()
                .flatMap(Demo::createStream)
                .collect(Collectors.toList());
        System.out.println(newList);
    }

    public static Stream<Integer> createStream(String e) {
        Optional<Integer> opt = MyClass.returnsOptional(e);
        return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
    }
}


class MyClass {
    public static Optional<Integer> returnsOptional(String e) {
        try {
            return Optional.of(Integer.valueOf(e));
        } catch (NumberFormatException ex) {
            return Optional.empty();
        }
    }
}

如果returnsOptional不能是静态的,则需要使用“箭头”表达式而不是“方法引用”

 类似资料:
  • 问题内容: 如何在显示时删除可选值上的文本而不必强制输入。 更新资料 当会话具有值时,其具有值: 问题答案: 您可以使用(null合并运算符)解开它,并提供默认值(如果为nil)

  • 我有一个Web应用程序,它的日志非常多。我们为每个请求线程实现了对的调用,以便能够在日志中跟踪用户。 日志消息可以如下所示: 现在的问题是,大多数情况下,不存在当前用户,并且我们不能使用上面日志示例中的字段。因此,它将看起来像这样: 有没有办法不写MDC密钥 我希望它看起来像这样,如果没有找到MDC值: 以上(MDC)示例配置如下:

  • 问题内容: 如何通过使用和避免返回值? 例: 问题答案: 要返回可选值的值,或者返回默认值(如果可选值没有值),则可以使用。 请注意,我重写了查找最长名称的代码:您可以直接与比较器比较每个String的长度。可以通过调用键提取器作为方法引用来获得一个这样的比较器。

  • 当我想检查可选布尔值是否为真时,这样做行不通: 它会导致以下错误: 可选类型“@IvalueBool?”不能用作布尔值;测试'!=而不是零 我不想检查nil;我想检查返回的值是否为真。 如果布尔值==true,我是否总是必须执行

  • 问题内容: 在阅读The Swift Programming Language时 ,我遇到了以下片段: 您可以使用 if 和 let 一起使用可能缺少的值。这些值表示为 optionals 。可选值包含一个值或包含nil来指示该值丢失。在值的类型后写一个问号(?),以将该值标记为可选。 片段1很清楚,但是片段2发生了什么?有人可以分解并解释吗?它只是使用块的替代方法吗?在这种情况下的确切作用是什么

  • 问题内容: 从Apple的文档中: 您可以使用和一起使用可能缺少的值。这些值表示为可选值。可选值包含一个值或包含一个指示该值丢失的值。在值的类型后写一个问号(),以将该值标记为可选。 为什么要使用可选值? 问题答案: Swift中的可选类型是可以保存值或不保存值的类型。通过将a附加到任何类型来编写可选内容: 可选(以及泛型)是最难理解的Swift概念之一。由于它们是如何编写和使用的,很容易对它们是