在列表中查找匹配项时出现 NoSuchElementException

Fio*_*t86 4 java filter optional java-8 java-stream

以下老式的简单代码工作正常(遍历字符串列表,并返回 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;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想做同样的事情,但改用 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Lou*_*man 5

Optional.get()只有当你知道有没有实际值使用。如果没有价值,它会抛出 NSEE,正如您所发现的。

看起来你想要.findFirst().isPresent(),或者如下所述,anyMatch(predicate).