一、Stream流介绍

        stream流操作是Java 8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作。Stream类中每一个方法都对应集合上的一种操作。将真正的函数式编程引入到Java中,能 让代码更加简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。
        同时stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。在Stream中的操作每一次都会产生新的流,内部不会像普通集合操作一样立刻获取值,而是 惰性取值 ,只有等到用户真正需要结果的时候才会执行。 并且对于现在调用的方法,本身都是一种高层次构件,与线程模型无关。因此在并行使用中,开发者们无需再去操 心线程和锁了。Stream内部都已经做好了 。
        关于对Stream流的理解,你可以把他当成工厂中的流水线,每个stream流的操作过程遵循着创建 -->操作 -->获取结果的过程,就像流水线上的节点一样组成一个个链条。除此之外你还可以把他理解成sql的视图,集合就相当于数据表中的数据,获取stream流的过程就是确定数据表的属性和元数据的过程,元数据的每一个元素就是表中的数据,对stream流进行操作的过程就是通过sql对这些数据进行查找、过滤、组合、计算、操作、分组等过程,获取结果就是sql执行完毕之后获取的结果视图一样,深入理解stream流可以让我们使用更加简洁的代码获取自己想要的数据。

二、Stream流的基本用法

 List<String> strList = Arrays.asList("1", "2", "3", "4", "5","5","4");
        System.out.println(strList);

        //过滤
        List<String> filter = strList.stream().filter(s -> 
        s.equals("3")||s.equals("4")).collect(Collectors.toList());
        System.out.println(filter);

        //去重
        List<String> distinct = strList.stream().distinct().collect(Collectors.toList());
        System.out.println(distinct);

        //获取第一个元素
        String any = strList.stream().findAny().get();
        String first = strList.stream().findFirst().get();

        System.out.println(any);
        System.out.println(first);
        //此方法值不确定
        for (int i = 0; i < 100; i++) {
            String findAny = strList.parallelStream().findAny().get();
            System.out.println(findAny);
        }

        //获取最长的字符串
        List<String> stringList = Arrays.asList("xiao", "xiaobu", "xiaobudian");
        Optional<String> max = stringList.stream().max(Comparator.comparing(String::length));
        System.out.println(max);

        //获取最短的字符串
        Optional<String> strMin = stringList.stream().min(Comparator.comparing(String::length));
        System.out.println(strMin);
        Optional<String> min = stringList.stream().min(String::compareToIgnoreCase);
        System.out.println(min);

        //获取int最大值
        List<Integer> integers = Arrays.asList(1, 2, 3, 6, 51, 45);
        Optional<Integer> integerMax = integers.stream().max(Integer::compareTo);
        System.out.println(integerMax);

        //获取int最小值
        Optional<Integer> minInt = integers.stream().min(Comparator.comparingInt(Integer::shortValue));
        Optional<Integer> minInt1 = integers.stream().min(Comparator.comparing(Integer::intValue));
        System.out.println(minInt);
        System.out.println(minInt1);

三、Stream流的对象值比较

        //对象值比较
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("小明",15));
        personList.add(new Person("大强",18));
        personList.add(new Person("小泽玛利亚",22));
        //获取名字最长的对象
        Person person = personList.stream().max(Comparator.comparing(Person::getName)).get();
        System.out.println(person);
        //获取年龄最小的
        Person person1 = personList.stream().min(Comparator.comparing(Person::getAge)).get();
        System.out.println(person1);

四、Stream流的缩减

        List<Integer> integerList = Arrays.asList(1, 2, 3, 6, 51, 45);
        //求和
        Integer reduce = integerList.stream().reduce(0,Integer::sum);
        System.out.println(reduce);
        //在求和的值上加10
        Integer reduce1 = integerList.stream().reduce(10,Integer::sum);
        System.out.println(reduce1);

        //其他写法
        Integer reduce2 = integerList.stream().reduce(10, (x, y) -> x + y);
        System.out.println(reduce2);
        //相乘并乘10
        Integer reduce3 = integerList.stream().reduce(10, (x, y) -> x * y);
        System.out.println(reduce3);

        //求最大值
        Optional<Integer> reduce4 = integerList.stream().reduce(Integer::max);
        System.out.println(reduce4);


        List<Person> personList = new ArrayList<>();
        personList.add(new Person("小明",15));
        personList.add(new Person("小泽玛利亚",22));
        personList.add(new Person("大强",18));
        personList.add(new Person("光头强",12));
        //对象中求年龄的和
        Optional<Integer> ageSum = personList.stream().map(p -> p.getAge()).reduce(Integer::sum);
        System.out.println(ageSum);
        //对象中年龄最大的
        Optional<Integer> reduce5 = personList.stream().map(p -> p.getAge()).reduce(Integer::max);
        personList.stream().max(Comparator.comparing(Person::getAge));
        //对比后获得年龄最大的对象
        Person person = personList.stream().reduce((p1, p2) -> p1.getAge() > p2.getAge() ? p1 : p2).get();
        System.out.println(person);
        System.out.println(reduce5);

五、Stream流的Collect用法

 List<Person> personList = new ArrayList<>(4);
        personList.add(new Person("小明",15));
        personList.add(new Person("小明",18));
        personList.add(new Person("小明",18));
        personList.add(new Person("小泽玛利亚",22));
        personList.add(new Person("大强",18));
        personList.add(new Person("光头强",12));
        // 获取平均年龄 averaging
        Double avg = personList.stream().collect(Collectors.averagingInt(Person::getAge));
        System.out.println(avg);
        //同时计算长度 和 最大值 最小值 平均值
        DoubleSummaryStatistics doubleCollect = personList.stream().collect(Collectors.summarizingDouble(Person::getAge));
        System.out.println(doubleCollect);

        //获取姓名组合为字符串,以,分割
        String pName = personList.stream().map(Person::getName).collect(Collectors.joining(","));
        System.out.println(pName);

        //求年龄的和
        Integer sum = personList.stream().map(Person::getAge).reduce(0, (x, y) -> x + y);
        Integer sum1 = personList.stream().map(Person::getAge).reduce(Integer::sum).get();
        System.out.println(sum);
        System.out.println(sum1);

        //分组
        //以名字进行分组
        Map<String, List<Person>> collect = personList.stream().collect(Collectors.groupingBy(Person::getName));
        System.out.println(collect);

        //先以名字分组,再以年龄分组
        Map<String, Map<Integer, List<Person>>> collect1
                = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge)));
        System.out.println(collect1);

        // toList、toSet、toMap
        List<Person> collect2 = personList.stream().collect(Collectors.toList());
        System.out.println(collect2);

六、Stream流的映射

 //转换为大写
        String[] strArr = { "abcd", "bcdd", "defde", "ftr" };
        Arrays.stream(strArr).map(String::toUpperCase).forEach(System.out::print);
        //转化list
        List<String> collect = Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList());
        System.out.println(collect);

七、Stream流的排序

        //自然排序并转换为list
        String[] strArr = { "ab", "bcdd", "defde", "ftr" };
        List<String> collect = Arrays.stream(strArr).sorted().collect(Collectors.toList());
        System.out.println(collect);
        //自定义排序
        // 按照字符串的长度 从小到大
        List<String> collect1 = Arrays.stream(strArr).sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
        System.out.println(collect1);
        //倒序
        List<String> collect2 = Arrays.stream(strArr).sorted(Comparator.comparing(String::length).reversed()).collect(Collectors.toList());
        System.out.println(collect2);

        // 首字母倒序
        List<String> collect3 = Arrays.stream(strArr).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        System.out.println(collect3);

        List<String> collect4 = Arrays.stream(strArr).sorted(Comparator.naturalOrder()).collect(Collectors.toList());
        System.out.println(collect4);

八、Stream流的提取流和组合流

 String[] arr1 = {"a","b","c","d"};
        String[] arr2 = {"d","e","f","g"};
        String[] arr3 = {"i","j","k","l"};

        Stream<String> stream1 = Arrays.stream(arr1);
        Stream<String> stream2 = Arrays.stream(arr2);
        Stream<String> stream3 = Arrays.stream(arr3);

        //合并去重
        List<String> collect = Stream.concat(stream1, stream2).distinct().collect(Collectors.toList());
        System.out.println(collect);


        // limit,限制从流中获得前n个数据
        List<String> collect1 = collect.stream().limit(3).collect(Collectors.toList());
        System.out.println(collect1);

        // skip,跳过前n个数据
        List<String> collect2 = collect.stream().skip(3).collect(Collectors.toList());
        System.out.println(collect2);

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐