【Java8】 map和flatMap的使用

map方法

        流支持map方法,接受一个函数作为参数。这个函数会被应用到每一个元素上,并将其映射成一个新的元素 。例如:Dish::getName 传给了map方法,用来提取菜肴的名称。getName 方法返回的是一个String,所以map方法输出的流
的类型就是Stream

// 获取名字的长度
    @Test
    public void testMap() {
        ArrayList words = Lists.newArrayList("java8", "Lambdas", "in");
        List collect = words.stream()
                .map(String::length)
                .collect(Collectors.toList());

        Map collect1 = words.stream().collect(Collectors.toMap(i -> i, i -> i.length()));
        logger.info("words 长度是:{}", collect); //words 长度是:[5, 7, 2]
        logger.info("collect1 map是:{}", collect1);//{Lambdas=7, in=2, java8=5}
    }

flatMap方法

   遇到的场景是,对于给定的单词表["hello","world"],你想要得到的是["H","e","l", "o","W","r","d"],单独的使用map方法

 List collect2 = words.stream()
                .map(word -> word.split(""))
                .distinct()
                .collect(toList());

 map实际上返回的是Stream类型的, 但是真正想要的是Stream 来表示一个字符流。使用map的图解

【Java8】 map和flatMap的使用_第1张图片

    需要的是一个字符流,而不是数组流。又一个叫做Arrays.stream()的方法可以接受一个数并产生一个流。
    可以使用flatMap来解决这个问题
    使用flatMap的效果,各个数组不是分别映射成一个流,而是映射成流的内容。所有使用map(Arrays::stream)时生成的
    单个流都被合并起来,既扁平化成一个一个流,图解如下:

 【Java8】 map和flatMap的使用_第2张图片  

一言以蔽之,flatMap方法会让给你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

  同样下面的这个图,对于flatMap的说明感觉很形象。

      【Java8】 map和flatMap的使用_第3张图片

demo 练习

例如有以下的需求,一个字符串数组{"hello","word"},想得到所有的单个字符号["h","e","l","l","o","w","o","r","d"],会如何做呢?原来内容实现方法会这样:

 @Test
    public void testFlatMap() {
        Gson gson = new Gson();
        String[] helloStr = {"hello", "word"};

        List list = Lists.newArrayList();
        Arrays.stream(helloStr)
                .forEach(str -> {
                    List collect1 = Arrays.stream(str.split("")).collect(Collectors.toList());
                    list.addAll(collect1);
                });
        logger.info("list 结果是:{}", gson.toJson(list));
        //这是原来解决方法 (分层剥离,然后合并到一个list中去)
        // list 结果是:["h","e","l","l","o","w","o","r","d"]
    }

使用flatMap实现

 @Test
    public void testFlatMap() {
        Gson gson = new Gson();
        String[] helloStr = {"hello", "word"};
       
        //分步写(流只能消费一次)(flatMap)
        Stream stream1 = Arrays.asList(helloStr).stream().
                map(str -> str.split(""));

        Stream stringStream = stream1.flatMap(strings1 -> Arrays.stream(strings1));

        List stringList1 = stringStream.collect(Collectors.toList());
        logger.info("结果是:{}", gson.toJson(stringList1));
        //结果是:["h","e","l","l","o","w","o","r","d"]

        //最后汇总写法
        List newList = Arrays.stream(helloStr)
                .map(str -> str.split(""))
                .flatMap(str -> Arrays.stream(str))
                .collect(Collectors.toList());
        logger.info("newList 结果是:{}", gson.toJson(newList));
        //newList 结果是:["h","e","l","l","o","w","o","r","d"]
        //https://www.cnblogs.com/java-le/p/7909729.html 讲解

    }

 

参考博客

https://www.cnblogs.com/diegodu/p/8794857.html  

https://www.cnblogs.com/java-le/p/7909729.html

小结

        主要是为了区分下,何时会使用flatMap,现在感觉是flatMap 适用于 List> 这种类型的结果,数组里面包含一个数组,但是想获取object每个元素,可以使用这个

 

 

你可能感兴趣的:(java)