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

pri*_*kar 1 java lambda java-8 java-stream

我有一个项目集合

List<String> lstRollNumber = new ArrayList<String>();
lstRollNumber.add("1");
lstRollNumber.add("2");
lstRollNumber.add("3");
lstRollNumber.add("4");
Run Code Online (Sandbox Code Playgroud)

现在我想搜索RollNumber该集合中的特定内容.说

String rollNumberToSearch = "3";
Run Code Online (Sandbox Code Playgroud)

我可以通过循环遍历集合并检查每个项目来轻松完成,如果有任何匹配,我可以突破循环并从函数返回true.

但是我想使用Lambda表达式来做这件事.

在C#中我们使用(以及其他选项),

var flag = lstRollNumber.Exists(x => x == rollNumberToSearch);
Run Code Online (Sandbox Code Playgroud)

如何在Java 1.8中做同样的事情?

我试过了

String rollNumberToSearch = "3";
Stream<String> filterRecs = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch));
Run Code Online (Sandbox Code Playgroud)

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

Tag*_*eev 7

您的错误是您正在使用流中间操作filter而不调用流终端操作.阅读官方文档中的流操作类型.如果您仍想使用filter(出于学习目的),您可以使用findAny()或解决您的任务anyMatch():

boolean flag = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch))
                             .findAny().isPresent();
Run Code Online (Sandbox Code Playgroud)

要么

boolean flag = lstRollNumbers.stream().filter(rn -> rn.equals(rollNumberToSearch))
                             .anyMatch(rn -> true);
Run Code Online (Sandbox Code Playgroud)

或者根本不使用filter(如@marstran建议的那样):

boolean flag = lstRollNumbers.stream().anyMatch(rn -> rn.equals(rollNumberToSearch));
Run Code Online (Sandbox Code Playgroud)

另请注意,方法参考可以在这里使用:

boolean flag = lstRollNumbers.stream().anyMatch(rollNumberToSearch::equals);
Run Code Online (Sandbox Code Playgroud)

但是,如果你想使用它不是为了学习,而是在生产代码中,那么使用旧的更容易和更快Collection.contains:

boolean flag = lstRollNumber.contains("3");
Run Code Online (Sandbox Code Playgroud)

可以根据集合类型优化contains方法.例如,HashSet它只是哈希查找,它比.stream().anyMatch(...)解决方案更快.即使ArrayList呼叫contains会更快.


mar*_*ran 6

使用anyMatch.true如果流中的任何元素与谓词匹配,则返回:

String rollNumberToSearch = "3";
boolean flag = lstRollNumbers.stream().anyMatch(rn -> rn.equals(rollNumberToSearch));
Run Code Online (Sandbox Code Playgroud)

  • 当然,正如Tagir Valeev所提到的,`lstRollnumbers.contains(rollNumberToSearch)`在这种特殊情况下更好. (2认同)