首页 > 解决方案 > 收集后在 java8 上获取索引

问题描述

我有以下代码,我想使用 Java 8 流 API 进行翻译。

count = 0;
for (A a : someList) {
   if (a.get() == 1) {
     count++;
     newList.add(new X(count));
   }
}

映射时如何获得该计数?

newList = someList.stream
.filter(a -> a.get().equals("red"))
.map(a -> new X(count))
.collect(Collectors.toList());

标签: lambdajava-8java-stream

解决方案


for循环版本更适合这种类型的逻辑,但如果你真的使用 Streams,那么我会保持简单,分两步完成,而不是尝试将所有逻辑转储到单个流管道中,这可能会导致可读性降低代码。

int count = (int)someList.stream()
                         .filter(a -> a.get().equals(“red”))
                         .count();

IntStream.rangeClosed(1, count)
         .mapToObj(X::new)
         .collect(toList());

正如已经提到的,这绝不比for循环版本更好,但这里是为了说明,有时在使用流时,最好的方法是执行多次传递,而不是试图将所有内容都放入单个管道中。


推荐阅读