我无法在Java中使用forEach方法进行递增。

huangapple go评论71阅读模式
英文:

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&lt;Integer&gt;l=new ArrayList&lt;Integer&gt;();

    l.add(1);
    l.add(2);
    l.forEach(k-&gt;k=new Integer(k.intValue()+1));
     
          
    l.forEach((k-&gt;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&lt;Integer&gt;l=new ArrayList&lt;Integer&gt;();
l.add(1);
    l.add(2);
   for(int i=0;i&lt;l.size();i++){
       l.set(i, l.get(i)+1);
   }
     
       
          
    l.forEach((k-&gt;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&lt;Integer&gt; l = new ArrayList&lt;&gt;();
l.forEach(new Consumer&lt;Integer&gt;() {
     @Override
     public void accept(Integer integer) {
        integer+=1;  // notice, no return
     }
 });

You want to use l.stream().map(k -&gt; k + 1) to update each element

l.stream().map(new Function&lt;Integer, Integer&gt;() {
    @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 -&gt; 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 -&gt; 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&lt;Integer&gt; l = new ArrayList&lt;&gt;();

		// Add some integers to the list
		l.add(1);
		l.add(2);

		// Increment elements by 1
		IntStream.range(0, l.size()).forEachOrdered(i -&gt; l.set(i, l.get(i) + 1));

		// Display
		l.forEach(System.out::println);
	}
}

Output:

2
3

huangapple
  • 本文由 发表于 2020年7月24日 23:41:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/63076903.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定