evelynnn001
evelynnn001
采纳率100%
2021-03-04 11:00

java forEach用法

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

8条回答

  • technologist_08 CSDN技术专家团—wangjie 1月前

    这个问题其实是 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

    点赞 2 评论 复制链接分享
  • weixin_45476644 weixin_45476644 1月前

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

    点赞 2 评论 复制链接分享
  • qq_43243317 穿白衬衣的少年 1月前

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

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

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

    点赞 1 评论 复制链接分享
  • weixin_41830716 规则边缘 1月前

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

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

    点赞 1 评论 复制链接分享
  • qq_35962418 _青菜 1月前

    没学过箭头..

    点赞 评论 复制链接分享
  • w2298119289j 哆啦A梦丶幻想 1月前

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

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

    点赞 评论 复制链接分享
  • weixin_45062785 我的编号9527 1月前

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

    点赞 评论 复制链接分享
  • w2298119289j 哆啦A梦丶幻想 1月前

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

    点赞 评论 复制链接分享