如何使用 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
也会更快。
我有 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
也会更快。