【问题标题】:Java stream - Cannot modify the contents of a list with forEachJava 流 - 无法使用 forEach 修改列表的内容
【发布时间】:2020-07-22 19:08:00
【问题描述】:

我必须在下面实现一个方法map(),它接收一个数组列表和一个Function<T, R>对象,并且 返回一个数组列表,其中包含将函数应用于给定元素的结果。

以下代码打印1,2,3,而不是这些数字的平方。为什么代码不起作用?我需要失败的原因,而不是正确的解决方案。

import java.util.ArrayList;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Mapper {
    public static ArrayList<Integer> map(ArrayList<Integer> nums, Function<Integer, Integer> mapper) {
        ArrayList<Integer> result = new ArrayList<>(nums);
        result.forEach(e -> e = mapper.apply(e));
        return result;
    }

    public static void main(String [] args){
        ArrayList<Integer> nums = IntStream.rangeClosed(1, 3).boxed().collect(Collectors.toCollection(ArrayList::new));
        ArrayList<Integer> squares = Mapper.map(nums, z -> z * z);
        squares.forEach(System.out::println);
    }
}

【问题讨论】:

    标签: java arraylist functional-programming java-stream


    【解决方案1】:

    这是因为result.forEach(e -&gt; ... ) e 不是对列表元素的引用,而是列表中的整数值。将该行视为等效于:

    for (int e : nums) {
      e = e * e;
    }
    

    这也不会更新num 集合中的元素。

    【讨论】:

      【解决方案2】:

      这是因为在result.forEach(e -&gt; ... ) 中,“e”不是对元素的引用,而是对值的引用。

      import java.util.*;
      import java.lang.*;
      import java.io.*;
      import java.util.function.*;
      import java.util.stream.*;
      
      public class Mapper {
          public static List<Integer> map(List<Integer> numbers, Function<Integer, Integer> mapper) {
              return numbers.stream()
                  .map(mapper)
                  .collect(Collectors.toList());
          }
      
          public static void main(String [] args){
              List<Integer> numbers = new ArrayList<>(Arrays. asList(1, 2));
              map(numbers, number -> number * number).forEach(System.out::println);
          }
      }
      

      【讨论】:

        【解决方案3】:

        在你的情况下map 会更合适:

        public static ArrayList<Integer> map(ArrayList<Integer> nums, Function<Integer, Integer> mapper) {
            return nums.stream()
                .map(mapper)
                .collect(Collectors.toList());
        }
        

        【讨论】:

          猜你喜欢
          • 2010-10-26
          • 2022-01-01
          • 1970-01-01
          • 2012-11-24
          • 2019-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多