我有如下元素的集合
List<String> lstRollNumber = new ArrayList<String>();
lstRollNumber.add("1");
lstRollNumber.add("2");
lstRollNumber.add("3");
lstRollNumber.add("4");
现在我想在该集合中搜索特定的 RollNumber
。说
String rollNumberToSearch = "3";
我可以通过遍历集合并检查每个项目来轻松做到这一点,如果有任何匹配项,我可以突破循环并从函数返回 true。
但我想使用 Lambda 表达式 来执行此操作。
在 C# 中,我们使用(以及其他选项),
var flag = lstRollNumber.Exists(x => x == rollNumberToSearch);
如何在 Java 1.8 中做同样的事情?
我试过
String rollNumberToSearch = "3";
Stream<String> filterRecs = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch));
但我知道这是错误的? 请指导。
最佳答案
您的错误是您正在使用流中间 操作filter
而没有调用流终端 操作。阅读 official documentation 中的流操作类型.如果您仍想使用 filter
(出于学习目的),您可以使用 findAny()
或 anyMatch()
解决您的任务:
boolean flag = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch))
.findAny().isPresent();
或者
boolean flag = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch))
.anyMatch(rn -> true);
或者根本不使用filter
(正如@marstran 所建议的):
boolean flag = lstRollNumbers.stream().anyMatch(rn -> rn.equals(rollNumberToSearch));
另请注意,此处可以使用方法引用:
boolean flag = lstRollNumbers.stream().anyMatch(rollNumberToSearch::equals);
但是,如果您不想将其用于学习,而是用于生产代码,那么使用旧的 Collection.contains
会更容易和更快。 :
boolean flag = lstRollNumber.contains("3");
contains 方法可以根据集合类型进行优化。例如,在 HashSet
中,它只是散列查找,这比 .stream().anyMatch(...)
解决方案快得多。即使对于 ArrayList
调用 contains
也会更快。
关于java - 如何使用 Lambda 在 java1.8 中的字符串集合中搜索特定项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32601824/