java - 在 Java 8 中是否有一种简洁的方法来迭代带有索引的流?

标签 java java-8 java-stream

是否有一种简洁的方法来迭代流,同时访问流中的索引?

String[] names = {"Sam","Pamela", "Dave", "Pascal", "Erik"};

List<String> nameList;
Stream<Integer> indices = intRange(1, names.length).boxed();
nameList = zip(indices, stream(names), SimpleEntry::new)
        .filter(e -> e.getValue().length() <= e.getKey())
        .map(Entry::getValue)
        .collect(toList());

与那里给出的 LINQ 示例相比,这似乎相当令人失望

string[] names = { "Sam", "Pamela", "Dave", "Pascal", "Erik" };
var nameList = names.Where((c, index) => c.Length <= index + 1).ToList();

有没有更简洁的方法?

此外,zip 似乎已移动或被删除...

最佳答案

最简洁的方法是从索引流开始:

String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"};
IntStream.range(0, names.length)
         .filter(i -> names[i].length() <= i)
         .mapToObj(i -> names[i])
         .collect(Collectors.toList());

结果列表仅包含“Erik”。

<小时/>

当您习惯 for 循环时,一种看起来更熟悉的替代方法是使用可变对象(例如 AtomicInteger)维护临时计数器:

String[] names = {"Sam", "Pamela", "Dave", "Pascal", "Erik"};
AtomicInteger index = new AtomicInteger();
List<String> list = Arrays.stream(names)
                          .filter(n -> n.length() <= index.incrementAndGet())
                          .collect(Collectors.toList());

请注意,在并行流上使用后一种方法可能会中断,因为不一定“按顺序”处理项目

关于java - 在 Java 8 中是否有一种简洁的方法来迭代带有索引的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25062436/

相关文章:

java - 为什么此代码中没有发生同步?

java - 在 CDI SessionScoped bean 中注入(inject) HttpServletRequest

Java 8 Lambda(一步分组和归约)

Java lambda 在文本框中显示

java - 在 reduce 操作中使用 StringBuilder(...) 作为标识值会产生不可预测的结果

java - Spring 框架 - 超时 java.net.SocketTimeoutException : timeout

java - 为什么我的代码无法在 java 多线程中运行多个客户端?

java - 选项类型变量和返回它们的方法的通用命名约定

java - 如何在Java中查找一年的总周数?

java - 正则表达式替换为 Stream