试用java 8流。在流中是否可以从包含大量元素的List中查找以X,Y,Z开头的元素计数。
transactions.stream()
.filter(e -> startsWith("X"))
.count();
transactions.stream()
.filter(e -> startsWith("Y"))
.count();
transactions.stream()
.filter(e -> startsWith("Z"))
.count();
上面的代码给出了列表中以X,Y,Z开头的元素的计数,但在上面的例子中,我正在遍历列表三次以获得数据。这可以通过使用简单的for循环迭代列表一次来完成。是否可以在单个流中执行所有这些条件[仅迭代一次]而不是使用多个流?
非常感谢任何帮助。
答案 0 :(得分:10)
我不会为此使用流。但如果必须,请看一下这段代码:
Map<String, Long> collect = transactions.stream().collect(Collectors.groupingBy(t -> {
if (t.startsWith("X")) {
return "X";
}
if (t.startsWith("Y")) {
return "Y";
}
if (t.startsWith("Z")) {
return "Z";
}
return "none";
}, Collectors.counting()));
将打印类似
的内容{X=1, Y=1, Z=1, none=1}
针对具体案例
答案 1 :(得分:0)
这个怎么样,它可以找到第一个字母的所有类型。
Map<String, Long> collect = transactions.stream()
.collect(Collectors.groupingBy(s -> s.substring(0, 1), Collectors.counting()))
不仅是'X','Y','Z',还有'a','c'或你给出的元素的任何首字母。
最后,您可以使用get
方法获取所需内容,如下所示:
collect.get("X");
collect.get("Y");
collect.get("Z");