流过滤器返回 null findFirst 获取异常

Posted

技术标签:

【中文标题】流过滤器返回 null findFirst 获取异常【英文标题】:stream filter return null findFirst getting exception 【发布时间】:2021-09-09 12:01:49 【问题描述】:

如果personList为空或过滤结果为空,以下会抛出异常:

Person b2cInwardAllocTxs = personList.stream()
   .filter(x -> x.getName().equalsIgnoreCase("Alvin"))
   .findFirst().get();

我收到以下错误:

Exception: java.util.NoSuchElementException: No value present

如何解决错误?

实际上,我只是希望它应该返回一个对象或null

【问题讨论】:

请提供所抛出异常的堆栈跟踪。在任何情况下,您都需要查看Optional 为您提供的选项(例如orElse 异常 java.util.NoSuchElementException: 不存在值 不要“期待”,而是阅读文档:docs.oracle.com/javase/8/docs/api/java/util/Optional.html#get-- 【参考方案1】:

要解决您的问题,您可以使用.orElse(null)

如果存在则返回值,否则返回null

Person b2cInwardAllocTxs = personList.stream()
   .filter(x -> "Alvin".equalsIgnoreCase(x.getName()))
   .findFirst()
   .orElse(null);

【讨论】:

【参考方案2】:

get 在空的Optional 上调用会抛出异常。相反,您可以使用orElse 返回null

Person b2cInwardAllocTxs = 
    personList.stream()
              .filter(x -> x.getName().equalsIgnoreCase("Alvin"))
              .findFirst()
              .orElse(null);

【讨论】:

【参考方案3】:

是的,Optional.get 抛出 NoSuchElementException 是不是没有这样的元素。 orElse 允许在没有元素的情况下使用默认替换。

Person b2cInwardAllocTxs =  personList.stream()
   .filter(x -> x.getName()
   .equalsIgnoreCase("Alvin")).findFirst().orElse(null);

【讨论】:

以上是关于流过滤器返回 null findFirst 获取异常的主要内容,如果未能解决你的问题,请参考以下文章

findFirst 不适用于 Prisma 上的 3 个过滤器

JAVA07_Stream流中FindFirst方法查找元素第一个

JAVA07_Stream流中FindFirst方法查找元素第一个

JAVA07_Stream流中FindFirst方法查找元素第一个

Java 8,流过滤器,反射,NoSuchMethodException [重复]

Java 8,流过滤器,反射,NoSuchMethodException [重复]