使用流有选择地修改列表项
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);
}
}
有没有办法使用流根据索引有选择地修改列表的元素。
例如,我想将列表的每个元素乘以 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);
}
}