【问题标题】:List filter in Java8 using isPresent methodJava8中使用isPresent方法的列表过滤器
【发布时间】:2019-03-23 10:35:55
【问题描述】:

我有一个包含一些字符串值的列表。我想迭代列表与另一个字符串进行比较。只有当另一个字符串与列表中的任何元素都不匹配时,我才应该进入循环。我尝试了类似下面的方法,但没有奏效。在 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");
}

【问题讨论】:

  • 您的逻辑是错误的:它会测试列表中是否至少有一个元素与“test”不同。使用Stream.noneMatch()docs.oracle.com/javase/8/docs/api/java/util/stream/…
  • 标题中的使用isPresent 方法 真的是an XY problem。查看链接,了解如何改进有关 Stack Overflow(和其他地方)的下一个问题。

标签: java lambda java-8 java-stream


【解决方案1】:

您应该为此使用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");
}

【讨论】:

  • 当您说if(mylist.stream().noneMatch(str -&gt; str.equalsIgnoreCase("test"))) 时,我认为if 语句内部没有“太多逻辑”;实际上,是附加变量的创建使它看起来像是很多代码。
  • @Holger 我个人并不关心代码行数,我关心的是在需要时在调试和重新阅读代码上投入的时间。它可以是可读的和更短的,就是这样。但是 if 语句不是直接可读的。
  • 原始声明不是,但mylist.stream().noneMatch(str -&gt; str.equalsIgnoreCase("test"))noneMatchString 更多地说明了实际测试的内容。后者需要重新阅读更多代码。
  • @Holger 够公平
【解决方案2】:

你应该使用noneMatch()

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

【讨论】:

  • 正确。这里不需要filterfindFirst,也不需要低级的isPresent
  • 或者,使用方法参考:mylist.stream().noneMatch(testString::equalsIgnoreCase).
【解决方案3】:

以上可以不使用Stream API 来实现。下面是一个可能的解决方案

String searchValue = "COW";
List<String> list = Arrays.asList("CAT", "DOG");

if(!list.contains(searchValue)){
    System.out.println("Value is not Present");
}

【讨论】:

  • 很难与equalsIgnoreCase 合作。否则一个好主意。我理解反对票(但没有这样做)。
  • 同意..我在这里错过了这个要求..感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 2019-12-07
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2022-01-22
  • 2013-07-28
相关资源
最近更新 更多