英文:
i can't increment using the forEach method in java
问题
我无法增加使用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)));
英文:
i can't increment the values in the list using the foreach method
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)));
what is strange that printing values inside the list works fine.
and am asking this because using this method is supposed to be faster than the casual for loops
like this one:
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)));
答案1
得分: 1
forEach
没有副作用。它只是进行迭代,并且具有void
的返回类型,意味着在使用它时不会更新原始的列表/流。
以下是实际运行的代码示例:
List<Integer> l = new ArrayList<>();
l.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
integer += 1; // 注意,没有返回值
}
});
你可以使用 l.stream().map(k -> k + 1)
来更新每个元素:
l.stream().map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer + 1;
}
});
英文:
forEach
has no side-effects. It simply iterates and has a void
return type, meaning noting updates in the original list/stream using it.
Here is the actual code that runs
List<Integer> l = new ArrayList<>();
l.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
integer+=1; // notice, no return
}
});
You want to use l.stream().map(k -> k + 1)
to update each element
l.stream().map(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer + 1;
}
});
答案2
得分: 1
你可以使用流(Stream) API。使用 map()
方法对列表中的值进行增加,然后收集为一个列表并赋值给列表。
l = l.stream().map(k -> k+1).collect(Collectors.toList());
英文:
You can use Stream API. Use map()
to increment the value of list and then collect as list and assign list.
l = l.stream().map(k -> k+1).collect(Collectors.toList());
答案3
得分: 0
有很多方法可以实现,例如您可以使用 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<>();
// 向列表中添加一些整数
l.add(1);
l.add(2);
// 将元素增加1
IntStream.range(0, l.size()).forEachOrdered(i -> l.set(i, l.get(i) + 1));
// 显示结果
l.forEach(System.out::println);
}
}
输出:
2
3
英文:
There are many ways to do it e.g. you can use IntStream
as shown below:
IntStream.range(0, l.size()).forEachOrdered(i -> l.set(i, l.get(i) + 1));
Demo:
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);
}
}
Output:
2
3
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论