我有
下的项目集合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));
但我知道这是错的? 请指导。
答案 0 :(得分:7)
您的错误是您正在使用流中间操作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
也会更快。
答案 1 :(得分:6)
使用anyMatch
。如果流中的任何元素与谓词匹配,则返回true
:
String rollNumberToSearch = "3";
boolean flag = lstRollNumbers.stream().anyMatch(rn -> rn.equals(rollNumberToSearch));