Java 8实战-Stream map VS flatMap

Java 8实战–Stream流的使用
1、Map–对流中每一个元素进行处理
2、flatMap–流扁平化,让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流

实践代码如下:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class TestStreamMap
{
    private static void testMap(List<String> strList)
    {
        // 返回的是String[],所以去重不正确
        List<String[]> ret = strList.stream()
                        .map(str -> str.split(""))
                        .distinct()
                        .collect(Collectors.toList());
        // print
        ret.stream().forEach(strArr -> System.out.println(Arrays.asList(strArr).toString()));
    }
    
    private static void testFlatMap(List<String> strList)
    {
        List<String> ret = strList.stream()
                        .map(str -> str.split(""))
                        // 可以使每个数组变成一个单独的流
                        // .map(Arrays::stream)
                        // 将各个生成流扁平化为单个流,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流
                        .flatMap(Arrays::stream) 
                        .distinct()
                        // 字符串连接 Collectors.joining()
                        .collect(Collectors.toList());
        System.out.println(ret.toString());
    }
    
    /**
     * 给定两个数字列表,如何返回所有的数对呢?
     * 例如,给定列表[1, 2, 3]和列表[3, 4],应该返回
     * [(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]
     */
    private static void testNumberArr()
    {
        List<Integer> numbers1 = Arrays.asList(1, 2, 3);
        List<Integer> numbers2 = Arrays.asList(3, 4);
        /**
        List<int[]> pairs = numbers1.stream()
                        .flatMap(i -> numbers2.stream().map(j -> new int[]{ i, j }))
                        .collect(Collectors.toList());
        // 打印单个元素
        pairs.stream().flatMapToInt(Arrays::stream).forEach(System.out::println);
        // output: 1 3 1 4 2 3 2 4 3 3 3 4
        */
        List<Integer[]> pairs = numbers1.stream()
                        .flatMap(i -> numbers2.stream().map(j -> new Integer[]{ i, j }))
                        .collect(Collectors.toList());
        pairs.stream().forEach(numberArr -> System.out.println(Arrays.asList(numberArr).toString()));
        
    }
    
    public static void main(String[] args)
    {
        String[] strArr = {"hello", "world"};
        // List<String> strL = new ArrayList<>(); // <>运算符
        List<String> strL = Arrays.asList(strArr);
        testMap(strL);
        testFlatMap(strL);
        testNumberArr();
    }

}

输出:

[h, e, l, l, o]
[w, o, r, l, d]
[h, e, l, o, w, r, d]
[1, 3]
[1, 4]
[2, 3]
[2, 4]
[3, 3]
[3, 4]

参考书籍:

《Java8实战》

    原文作者:藏呆羊
    原文地址: https://blog.csdn.net/zangdaiyang1991/article/details/83784233
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞