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)
但我知道这是错的?请指导.
您的错误是您正在使用流中间操作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
会更快.
使用anyMatch
.true
如果流中的任何元素与谓词匹配,则返回:
String rollNumberToSearch = "3";
boolean flag = lstRollNumbers.stream().anyMatch(rn -> rn.equals(rollNumberToSearch));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
147 次 |
最近记录: |