在流上执行多个逻辑

Vic*_*cky 4 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();
Run Code Online (Sandbox Code Playgroud)

上面的代码给出了列表中以X,Y,Z开头的元素的计数,但在上面的例子中,我遍历列表三次以获得数据.这可以通过使用简单的for循环迭代列表一次来完成.是否可以在单个流中执行所有这些条件[仅迭代一次]而不是使用多个流?

任何帮助是极大的赞赏.

ste*_*fen 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()));
Run Code Online (Sandbox Code Playgroud)

会印出类似的东西

{X=1, Y=1, Z=1, none=1}
Run Code Online (Sandbox Code Playgroud)

针对具体情况

  • 我要注意的是,如果条件始终是第一个字符,那么将`t.charAt(0)`作为分类器返回会更简单. (2认同)
  • @AlexisC.有限的可扩展性(仅用于计数),它需要一个中间地图,加上通常的东西,如可怕的堆栈跟踪,不太直观的可调试等. (2认同)