在Java 8中,有没有一种简洁的方法可以迭代带有索引的流?

在访问流中的索引时,是否有一种简洁的方法可以在流上进行迭代?

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();

有没有更简洁的方法?

此外,似乎拉链已移动或已被移除…

回答:

最干净的方法是从索引流开始:

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”。

当你习惯于循环时,一种看起来更熟悉的替代方法是使用可变对象维护临时计数器,例如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 8中,有没有一种简洁的方法可以迭代带有索引的流? 的全部内容, 来源链接: utcz.com/qa/403335.html

回到顶部