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

How to search a specific item in a string collection in java1.8 using Lambda?

我有 collection 项

List<String> lstRollNumber = new ArrayList<String>();
lstRollNumber.add("1");
lstRollNumber.add("2");
lstRollNumber.add("3");
lstRollNumber.add("4");

现在我想在 collection 中搜索特定的 RollNumber。说

String rollNumberToSearch = "3";

我可以通过遍历 collection 并检查每个项目来轻松做到这一点,如果有任何匹配项,我可以突破循环并从函数中 return 为真。

但我想使用 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));

可是我知道错了? 请指导。

使用anyMatch。它 returns true 如果流中的任何元素匹配谓词:

String rollNumberToSearch = "3";
boolean flag = lstRollNumbers.stream().anyMatch(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 也会更快。