stream流中map和foreach的使用与区别

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

前言

jdk1.8的时候主要引进了Lambda表达式Date Time API(针对于时间计算,很方便很香)、Optional类(可以很好避免空指针异常)和Stream API

Stream API可以简化很多事情,比如使用filter配合Lambda表达式进行筛选满足的数据,再比如可以快速的使数组内数据进行排序,省略了去很多遍历数组然后各种判断操作。

但是对于不熟悉Stream API特性的同学就很不友好,第一眼看到会比较懵,所以使用Stream API需要一定的门槛,但对于有工作经验的同学熟悉下就可以了上手很快,非常推荐使用真的香。

foreach使用

通过名字就会有疑问这不就是平常用的增强for循环吗?

是的没错,完全可以把这个当作增强for循环使用,但是使用的方式又有一定的区别。

image.png

首先它是需要传入一个Consumer并且没有返回值,但是这个Consumer是个啥,点进去看一下。

image.png

看到了 @FunctionalInterface 那么我们是不是就可以使用函数式编程,直接在foreach中写Lambda表达式,尝试一下果然可以。

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("测试1");
    list.add("测试2");
    list.add("测试3");
    list.add("测试4");
    list.add("测试5");
    list.stream().forEach(li ->{
        System.out.println(li);
    });
}
复制代码

foreach和之前用的增强for很相似,对集合进行遍历还可以改变遍历时的数据并作用在集合上

map的使用

在没有接触Stream API之前听到这个map第一想到的就是hashMap,但是此map非彼map。

照样我们看下方法的源码是什么样子的,需要传入一个Function返回Stream

image.png

image.png

又看到了 @FunctionalInterface 那么就可以理解为我们传入一个方法,然后返回一个新的流给我们。验证一下

public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("测试1");
    list.add("测试2");
    list.add("测试3");
    list.add("测试4");
    list.add("测试5");
    List<String> collect = list.stream()
                               .map(a -> a = a + "测试")
                               .collect(Collectors.toList());
    collect.stream().forEach(li ->{
        System.out.println(li);
    });
    list.stream().forEach(li ->{
        System.out.println(li);
    });
}
复制代码

image.png

map不会改变当前数组,但是如果用了map需要得到一个新的数组就要使用 .collect(Collectors.toList())

使用场景与区别

使用场景:

如果我们需要改变数组中的元素时使用foreach
如果只是需要数组中的某些元素时使用map

区别:

foreach没有返回值,并且会对数组中所有的元素进行处理,同时还会改变数组中元素

map 可以返回一个全新的Stream对象,也可以使用 .collect(Collectors.toList()) 返回一个数组,同时不会对当前数组进行任何改变。

おすすめ

転載: juejin.im/post/7034504770647752718