我无法使用 foreach 方法增加列表中的值
List<Integer>l=new ArrayList<Integer>();
l.add(1);
l.add(2);
l.forEach(k->k=new Integer(k.intValue()+1));
l.forEach((k->System.out.println(k)));
奇怪的是,在列表中打印值效果很好。
我问这个是因为使用这种方法应该比随意的 for 循环更快 比如这个:
List<Integer>l=new ArrayList<Integer>();
l.add(1);
l.add(2);
for(int i=0;i<l.size();i++){
l.set(i, l.get(i)+1);
}
l.forEach((k->System.out.println(k)));
forEach
没有副作用。它只是进行迭代并具有 void
返回类型,这意味着使用它的原始列表/流中没有任何更新。
这是运行的实际代码
List<Integer> l = new ArrayList<>();
l.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
integer+=1; // notice, no return
}
});
您想使用
l.stream().map(k -> k + 1)
来更新每个元素
l.stream().map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer + 1;
}
});
您可以使用Stream API。使用
map()
增加列表的值,然后收集为列表并分配列表。
l = l.stream().map(k -> k+1).collect(Collectors.toList());
有很多方法可以做到这一点,例如您可以使用
IntStream
,如下所示:
IntStream.range(0, l.size()).forEachOrdered(i -> l.set(i, l.get(i) + 1));
演示:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
List<Integer> l = new ArrayList<>();
// Add some integers to the list
l.add(1);
l.add(2);
// Increment elements by 1
IntStream.range(0, l.size()).forEachOrdered(i -> l.set(i, l.get(i) + 1));
// Display
l.forEach(System.out::println);
}
}
输出:
2
3