第2篇 stream -- 映射(map or flatmap)

/**
 * 映射:
 * 一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里,你可以从表中选
 * 择一列。Stream API也通过map和flatMap方法提供了类似的工具。
 */
public class Demo2 {
    public static void main(String[] args) {
//        methord01();
//        methord02();
//        methord03();
//        methord04();
        methord05();
    }

    /**
     * 对流中每一个元素应用函数:
     * 流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映
     * 射成一个新的元素:
     */
    public static void methord01() {
        List<Dish> menues = Arrays.asList(new Dish("rice", true, 12, Dish.Type.FISH), new Dish("meat", false, 12, Dish.Type.FISH), new Dish("dog", true, 12, Dish.Type.FISH));
        //提取流中菜肴的名称;因为getName方法返回一个String,所以map方法输出的流的类型就是Stream<String>
        Set<String> nameSet = menues.stream().map(Dish::getName).collect(Collectors.toSet());
        System.out.println(nameSet.toString());
        //给定一个单词列表,你想要返回另一个列表,显示每个单词中有几个字母
        List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
        List<Integer> wordsLengthList = words.stream().map(String::length).collect(Collectors.toList());
        System.out.println(wordsLengthList.toString());
        //如果你要找出每道菜的名称有多长
        List<Integer> nameLengthSet = menues.stream().map(Dish::getName).map(String::length).collect(Collectors.toList());
        System.out.println(nameLengthSet.toString());


    }

    /**
     * 流的扁平化:
     * 你已经看到如何使用map方法返回列表中每个单词的长度了。让我们拓展一下:对于一张单
     * 词表, 如何返回一张列表, 列出里面各不相同的字符呢? 例如, 给定单词列表
     * ["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"]。
     */
    public static void methord02() {
        String[] arrayOfWords = {"Goodbye", "World"};
        List<String> wordsList = Arrays.asList(arrayOfWords);
        //错误一:word -> word.split("") 返回值是一个Stream<String[]>  故结果集为List<String[]> words;有问题吧?哈哈
        List<String[]> words = wordsList.stream().map(word -> word.split("")).distinct().collect(Collectors.toList());
        //错误二:我们需要想让map返回一个Stream<String>;List<String>-->Stream<String>-->Stream<String[]>->Stream<Stream<String[]>>--->List<Stream<String>>
        Stream<String> wordsStream = Arrays.stream(arrayOfWords);//流的整合
        List<Stream<String>> collect = wordsList.stream().map(word -> word.split("")).map(Arrays::stream).distinct().collect(Collectors.toList());
        //正确:使用flatMap方法的效果是,各个数组并不是分别映射成一个流,而是映射成流的内容。所
        //有使用map(Arrays::stream)时生成的单个流都被合并起来,即扁平化为一个流;Stream<String>;List<String>-->Stream<String>-->Stream<String[]>->Stream<String>--->List<String>
        List<String> wordsSet = wordsList.stream().map(word -> word.split("")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());
        System.out.println(wordsSet);

    }

    /**
     * 测试:
     * 给定一个数字列表,如何返回一个由每个数的平方构成的列表呢?例如,给定[1, 2, 3, 4,
     * 5],应该返回[1, 4, 9, 16, 25]。
     */
    public static void methord03() {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> result = numbers.stream().map(number -> number * number).collect(Collectors.toList());
        System.out.println(result.toString());
    }

    /**
     * 给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应
     * 该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。
     */
    public static void methord04() {
        List<Integer> numbers1 = Arrays.asList(1, 2, 3);
        List<Integer> numbers2 = Arrays.asList(3, 4);
        List<Integer[]> collect = numbers1.stream().flatMap(i -> numbers2.stream().map(j -> new Integer[]{i, j})).collect(Collectors.toList());
        for (Integer[] numerr :
                collect) {
            System.out.println(Arrays.asList(numerr).toString());

        }
    }

    /**
     * 如何扩展前一个例子,只返回总和能被3整除的数对呢?例如(2, 4)和(3, 3)是可以的。
     */
    public static void methord05() {
        List<Integer> numbers1 = Arrays.asList(1, 2, 3);
        List<Integer> numbers2 = Arrays.asList(3, 4);
        List<Integer[]> collect = numbers1.stream().flatMap(i -> numbers2.stream().filter(j -> (i + j) % 3 == 0).map(j -> new Integer[]{i, j})).collect(Collectors.toList());
        for (Integer[] numerr :
                collect) {
            System.out.println(Arrays.asList(numerr).toString());

        }
    }
}

github 地址哦:https://github.com/wangrui0/jdk1.8

猜你喜欢

转载自blog.csdn.net/qq_35524586/article/details/83145114