【问题标题】:NoSuchElementException when looking for a match in a List在列表中查找匹配项时出现 NoSuchElementException
【发布时间】:2016-04-01 01:11:41
【问题描述】:

以下老式的简单代码可以正常工作(遍历字符串列表,并返回 true,因为应该有匹配项):

public boolean isMatched() {
  List<String> stringList = Arrays.asList("str1", "str2", "str3");
  String matchString = "str1";

  for (String str : stringList) {
    if (StringUtils.equals(str, matchString)) {
        return true;
    }
  }

  return false;
}

现在,我想做同样的事情,但改用 Java 8。到目前为止我有这个:

public boolean isMatched() {
  List<String> stringList = Arrays.asList("str1", "str2", "str3");
  String matchString = "str1";
  return (stringList.stream().filter(str -> StringUtils.equals(matchString, str)).findFirst().get() != null);
}

使用第二种方法,我收到以下错误:

java.util.NoSuchElementException: No value present [junit] at java.util.Optional.get(Optional.java:135)

为什么我会收到这个错误,我应该怎么做才能解决它?

【问题讨论】:

    标签: java filter java-8 java-stream optional


    【解决方案1】:

    Optional.get() 在您知道那里有实际值时使用。如果没有值,它会抛出 NSEE,正如您所发现的。

    您似乎想要.findFirst().isPresent(),或者如下所述,anyMatch(predicate)

    【讨论】:

      【解决方案2】:

      Optional.get() 在不存在元素时抛出异常。它不返回null

      如果您想要获取元素的方法,如果不存在则null,它是orElse(null)

      但是,对于您的情况,我会使用anyMatch

      return stringList.stream().anyMatch(matchString::equals);
      

      【讨论】:

      • 好点,显示了正确的流操作,并且不需要 3rd 方库函数,但是,return stringList.contains(matchString); 更简单......
      【解决方案3】:

      如果您想要使用 kotlin 的任何单个元素从列表中使用过滤器而不获取 这种错误试试这样

       var myObject = list.filter { it.your_key.equals("your_value") }.singleOrNull()
      

      然后检查你的对象是否不为空并对其执行操作

      myObject?.your_key
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 2012-10-31
        • 2020-07-31
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多