JAVA8中,foreach()和stream().map()来对item进行操作,哪个更好?

新手上路,请多包涵
  public static void main(String[] args) {

        Integer[] qq = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        List<Integer> l = new ArrayList<>();
        Collections.addAll(l, qq);
        //1
        l = l.stream().map(e -> {
            return e + 1;
        }).collect(Collectors.toList());
        //2   
        l.forEach(integer -> integer++);
       }
阅读 5.2k
2 个回答

api的设计是通过语义的不同,让开发者做出更符合自己业务的代码。例如题目中mapforEach的区别:

  • map是变形操作,即:[0, 1, 2, 3] => [false, true, true, true],如果要完成这个事情,map就是最佳选择,符合语义设计,代码如下:
public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(0 ,1, 2, 3);

    List<Boolean> bools = nums.stream().map(num -> num != 0).collect(Collectors.toList());

    System.out.println(bools);
}
  • forEach是副作用,如果你只是想针对每一个值做额外的操作,如下,打印一下:
public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(0 ,1, 2, 3);

    nums.forEach(num -> {
        System.out.println(num);
    });
}

那就应该用forEach,也更符合他的语义。

这是语义化的好处,在程序执行层面没什么特别的对错或者好坏

你确定能在foreach里面改变integer的值?

你写的例子里两个执行效果都不一样,没法比。
效果一样的前提下,如果不是CPU密集型的功能,一般哪个可读性更好久用哪个

l.stream().map(e -> {
            return e + 1;
        }).collect(Collectors.toList());

这个会创建一个新的list,里面的值是l的对应位置元素值+1;

l.forEach(i -> i++)相当于

l.forEach(i -> {
    i++;
    return;
})

执行完什么都没变

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题