Java8:流 findFirst 结果

新手上路,请多包涵

我想知道是否有办法消除 findFirst().get() 的警告而不使用 .orElse() 当我 100% 知道每次都有结果时,所以我永远不会得到 NoSuchElementException

例如,让我们看下面的代码:

     List<String> myList = new ArrayList<>();
    myList.add("Test");
    myList.add("Example");
    myList.add("Sth");

    String fisrstString = myList.stream().findFirst().get(); // here I surely get "Test"

我不知道其他 IDE 如何处理这个问题,但 IntelliJ 将其视为警告

‘Optional.get()’ 没有 ‘isPresent()’

我想它可能不知道你什么时候能得到 NoSuchElementException 那里什么时候没有,或者我不知道为什么。我知道有一些方法可以解决这个警告( isPresent() 检查, .orElse(something) )但是代码无用,所以我不想使用这些解决方案,因为它们是不必要的。

您知道我能做什么,或者解释一下 IDE 是如何处理的吗?

原文由 Sunflame 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 787
2 个回答

好吧,对我来说,最好的方法是使用函数式编程并继续使用可选的。因此,例如,如果您需要将此字符串传递给某些服务,您可以这样做:

 String fisrstString = myList.stream().findFirst().get();
service.doSomething(fisrstString);

但这看起来不太好。相反,您可以利用函数式编程的优点,并执行以下操作:

 myList.stream().findFirst().ifPresent(service::doSomething);

原文由 Sergii Bishyr 发布,翻译遵循 CC BY-SA 3.0 许可协议

您应该使用 Optional 返回的 findFirst() 而不是试图获取它的值(如果它确实存在)。

 myList.stream()
    .findFirst()
    .ifPresent(/* consume the string here, if present */);

Optional.ifPresent 方法接收一个 Consumer 只有当 Optional 包含一个非空值时才会被使用。

问题是我们 Java 开发人员已经习惯了命令式范式……特别是,我们习惯于获取一个对象并将其 送到一个方法中:

 String myString = "hello"; // getting an object here

System.out.println(myString); // pushing the object to System.out here
                              // (via the println method)

使用 Optional 返回的 Stream.findFirst() 你正在做与上面相同的事情:

 String myString = myList.stream()
    .findFirst()
    .get(); // getting a string here

System.out.println(myString); // pushing the string here

另一方面,功能范式(包括 Optional )通常以另一种方式工作:

 myList.stream()
    .findFirst()
    .ifPresent(myString -> System.out.println(myString));

在这里,您不会获取字符串然后将其推送到某种方法。相反,您为 OptionalifPresent 操作提供一个参数,并让 Optional 的实现将值推入您的参数。换句话说,您通过 ifPresent 的参数 提取 Optional 包装的值。 ifPresent 然后将使用此 Consumer 参数,仅当存在该值时。

这种拉模式在函数式编程中经常出现,一旦你习惯了它就会非常有用。它只需要我们开发人员开始以不同的方式思考(和编程)。

原文由 fps 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题