【问题标题】:How to avoid a list to iterate when there are zero element当元素为零时如何避免列表迭代
【发布时间】:2020-03-13 19:58:22
【问题描述】:

当列表的元素为零并避免在stream().filter() lambda 函数中迭代时,我正在寻找解决方案,例如:

List<Person> list = new ArrayList<>(); 
list.stream().filter(element -> element.getProperty().equals("bla").findFirst().get();

如果列表大小为零,但程序不为空,则程序会抛出 NullPointerException

所以我使用传统的解决方案来检查 list 是否为 empty,例如:

if(list.size()> 0 ) 
  list.stream.filter( .....

您知道不使用传统 if 检查的不同解决方案吗?

更新

很抱歉报告异常,实际上,异常是一个

java.util.NoSuchElementException:不存在值

而不是NullPointerExcption

更新 2

所以正如VGR所说,我会改进代码

List<Person> list = new ArrayList<>(); 
list.stream().filter(element -> element.getName().equals("bla").findFirst().get();

还有 Person 类:

public class Person { 
    String name;
    public getName(){ 
        return this.name;
    }
}

【问题讨论】:

  • 这不是真的。在空列表上调用 stream() 将导致 Stream 永远不会调用其过滤器,并且 findFirst() 将始终返回一个空的 Optional。您根本不应该检查尺寸。请提供一个minimal reproducible example 来演示空列表如何生成 NullPointerException。
  • 您正在对一个空的可选选项调用 .get() .....
  • 你的问题还是有点糊涂。 A Minimal, Reproducible Example 真的很有帮助。请先自己运行它,以便确定它是可编译和可重现的。
  • 如果elementelement.getProperty() 可能是null,则第一个代码块中可能会发生NPE。另一方面,第二个块中的 NSEE 只能发生在 filter 没有更多元素之后的流中,并导致终端操作 findFirstOptional.empty
  • java.util.NoSuchElementException 表示您在getting 的值是一个空的可选项!看看 Andronicus 的回答...

标签: java arraylist lambda java-8 java-stream


【解决方案1】:

你可以使用Optional#ifPresent:

list.stream()
    .filter(element -> element.getProperty().equals("bla"))
    .findFirst()
    .ifPresent(/** process element if exists */);

【讨论】:

  • 所以异常继续,尽管异常启动是一种stackoverflow错误。
  • @alexandremonassaMoreira 空指针必须出现在过滤子句中
  • ifPresent() 方法由于某些原因很好,但对我来说最好的解决方案是方法 orElse() 或 orElseGet();感谢您的帮助;
  • @alexandremonassaMoreira 没问题,考虑将答案标记为正确;>
【解决方案2】:

我通过orElseGet() 解决了这个问题。

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 2016-07-15
    • 2013-08-29
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多