在Java8中,有没有一种简洁的方法可以通过索引对流进行迭代?

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

String[]name={“Sam”、“Pamela”、“Dave”、“Pascal”、“Erik”};
列表<字符串>名单;
溪流<整数>索引=内部消息(1,names.length).boxed();
nameList=zip(索引、流(名称)、SimpleEntry::new)
.filter(e->e.getValue().length()<=e.getKey())
.map(条目::getValue)
.collect(toList());

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

string[]name={“Sam”、“Pamela”、“Dave”、“Pascal”、“Erik”};
var nameList=名称。其中((c,索引)=>c.长度<=索引+1)。ToList();

有没有更简洁的方法

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

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

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

结果列表仅包含“Erik”


当您习惯于for循环时,一种更为常见的替代方法是使用可变对象(例如AtomicInteger)维护一个临时计数器:

String[]name={“Sam”、“Pamela”、“Dave”、“Pascal”、“Erik”};
AtomicInteger索引=新的AtomicInteger();
列表<字符串>list=Arrays.stream(名称)
.filter(n->n.length()<=index.incrementAndGet())
.collect(Collectors.toList());

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

发表评论