在访问流中的索引时,是否有一种简洁的方法来迭代流
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());
请注意,在并行流上使用后一种方法可能会中断,因为项目不必“按顺序”处理