在流上执行多个逻辑

时间:2017-05-24 19:23:52

标签: java java-8 java-stream

试用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循环迭代列表一次来完成。是否可以在单个流中执行所有这些条件[仅迭代一次]而不是使用多个流?

非常感谢任何帮助。

2 个答案:

答案 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");