使用流有选择地修改列表项

Modify list items selectively using stream

有没有办法使用流根据索引有选择地修改列表的元素。
例如,我想将列表的每个元素乘以 2,特定索引处的元素除外。
我尝试创建一个地图函数,但没有成功。我想写一个条件 if 元素的索引等于 skipIndex 然后我将 return 元素,否则我将 return 元素乘以 2。

int skipIndex = getSomeIndex();
list = list.stream().map(a -> {
            if(){ return a;}
            return a*2;
        }).collect(Collectors.toList());

提前致谢。

试试这个。使用 instream 遍历索引。


List<Integer> list = List.of(1,2,3,4,5);
int skipIndex = getSomeIndex();

List<integer> result = IntStream.range(0, list.size())
    .mapToObj(i-> i == skipIndex ? list.get(i) : list.get(i) * 2)
.collect(Collectors.toList());

System.out.println(result);

如果 skipIndex == 2,打印

[2, 4, 3, 8, 10]

注意:您不能将结果列表分配给原始变量,因为它实际上不是最终的(它在 lambda 中被引用)。

也可以这样做(但我不喜欢使用kludges来绕过有效的最终问题)。

int[] v = {0};
list = list.stream()
        .map(val -> v[0]++ == skipIndex ? val : val * 2)
        .collect(Collectors.toList());

这可能是最有效的(对于 ArrayList)。

for (int i = 0; i < list.size(); i++) {
    if (i != skipIndex) {
        int v = list.get(i)*2;
        list.set(i,v);
    }
}