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

标签 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));

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

最佳答案

您的错误是您正在使用流中间 操作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/

相关文章:

java - 使用 Java 进行条件 XML 解析

java - Wildfly 增加线程数

python - 如何修复 "Syntax error in module lambda_function"

java - 谓词中的运算符作为 lambda 表达式中的参数

java - 是否可以缩写java函数来删除变量?

java - 如何在 Java8 流/过滤器中使用非最终变量?

java - 如何使用 java 8 流创建多个新的 Hashmap?

java - 为什么IDEA打开中文文件夹时编译出错

java - 如何使用 Gradle 和 Spring Boot 捕获构建信息

c# - Linq.Expression TryCatch - 将异常传递给 Catch block ?