如何使用Lambda在java1.8中搜索字符串集合中的特定项?

时间:2015-09-16 07:04:48

标签: java lambda java-8 java-stream

我有

下的项目集合
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));

但我知道这是错的? 请指导。

2 个答案:

答案 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));