使用isPresent方法的Java8中的列表过滤器

man*_*ani 7 java lambda java-8 java-stream

我有一个包含一些String值的列表。我想与另一个String进行比较的列表。仅当另一个String与列表中的任何元素都不匹配时,我才应进入循环。我尝试了以下类似方法,但没有成功。还有其他替代方法可以在Java 8中做到这一点吗?

注意:在循环中,我将更多元素添加到同一列表中。因此,为避免出现这种情况ConcurrentModificationException,我在使用if条件进行验证。

List<String> mylist = new ArrayList<>();
mylist.add("test");
mylist.add("test1");

if(mylist.stream()
        .filter(str -> !(str.equalsIgnoreCase("test")))
        .findFirst()
        .isPresent()) {
    System.out.println("Value is not Present");
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*s K 9

你应该用 noneMatch()

if (mylist.stream().noneMatch(str -> str.equalsIgnoreCase(testString))) {
    System.out.println("Value is not Present");
}
Run Code Online (Sandbox Code Playgroud)

  • 正确。这里不需要`filter`,`findFirst`或低级`isPresent`。 (2认同)

Yas*_*jaj 9

您应该Stream#noneMatch为此使用。这将使您的代码更具可读性和简洁性。另外,请尽量避免在if语句中加入太多逻辑,请在可读变量中提取最大值

List<String> mylist = new ArrayList<>();
mylist.add("test");
mylist.add("test1");

Predicate<String> equalsIgnoreCasePredicate = str -> str.equalsIgnoreCase("test");
boolean noneMatchString = mylist.stream().noneMatch(equalsIgnoreCasePredicate);

if (noneMatchString) {
    System.out.println("Value is not Present");
}
Run Code Online (Sandbox Code Playgroud)

  • 当您说`if(mylist.stream()。noneMatch(str-&gt; str.equalsIgnoreCase(“ test”))))时,我认为if语句内没有太多逻辑。实际上,这是其他变量的创建,使其看起来像很多代码。 (2认同)