java forEach用法

这个问题可能很基础,但是请问各位大佬,为什么这么写的话并没有真正修改arr里 index3和4的值啊?

forEach里面的lambda 函数并没有真正修改原arr吗?

这个问题其实是 java “引用传递”和“值传递”的问题,并不是 forEach 方法或是 lambda 表达式的问题。

题主的这段代码去掉lamda表达式之后类似下面这段:

public void testArray(){
    int[] arr = new int[5];
    Arrays.setAll(arr, i -> i+1);
    System.out.println(arr);
    for(int i=0 ; i < arr.length ; i++){
        int element = arr[i];
        element = 10;
    }
    System.out.println(arr);
}

可以看到在循环中,是对 element 做了修改。

而 element 只是数组中元素的值,而不是数组中元素的引用。

所以修改 element 并不会改变数组中元素的值。

关于 java 中 “引用传递”和“值传递” 的问题,可以参考这篇博文 https://blog.csdn.net/javazejian/article/details/51192130

foreach循环只能用于读取,不能改变对应的值

1、stream会把数组转换成流处理,再收集流为数组,并不会改变原数组,而是形成新数组

2、foreach只是Consumer接口,没有返回值

3、即使要改变原数组,那赋值也是arr[0] = 1这种,而不是 i = arr[0]; i =1;——这种改变的是i的指向,而不是arr[0]

int流的forEach方法的参数是IntConsumer类型。它的定义是void accept(int value);

相当于把流中的每个元素(int作为参数时,为值传递)作为参数来调这个accept方法,所以不会修改原值。

你不用lambda函数写出来,为啥没有修改就一目了然了

处理的根本不是同一个对象 你说变不变?

你要调整数组的值,就要根据数组下标,调整数组中的值。

而不是直接给数组中的值赋值调整

没学过箭头..