Stream流

用来操作数组和集合中的元素,对容器中的元素,进行一系列的流水线式的中间操作,过滤筛选切片,不会对原数据做任何的改变,只是得到一个(持有结果的)新流.

创建Stream串行流,单线程

		List<Integer> integers = Arrays.asList(10, 20, 50, 40, 30);
        Stream<Integer> stream = integers.stream();//创建Stream流
		Stream<Integer> stream2 = Arrays.stream(new Integer[]{5, 4, 3, 2, 1, 0});
		Stream<Integer> Stream3 = Stream.of(9, 8, 7, 6, 5, 5, 8);

获取无限流

		//Stream.generate(Math::random).forEach(System.out::println);
        //Stream.iterate(0, integer -> integer+1).forEach(System.out::println);

打印流中元素

Stream3.forEach(System.out::println);

对流中的元素排序,利用comparator接口,lambda表达式

stream.sorted((o1, o2) -> o1 - o2).forEach(integer -> System.out.print(integer+" "));

跳过元素个数(1)

stream2.skip(1).forEach(System.out::println);

限制元素个数(2)

stream2.limit(2).forEach(System.out::println);
Stream.iterate(0, integer -> integer+1).limit(10).forEach(System.out::println);

去掉重复元素(需要重写元素的Hashcode和equals方法,integer和String默认重写了)

Stream3.distinct().forEach(System.out::println);

提取元素(可以提取引用数据类型的数据),并对其操作(集合中的元素通过流全部变成大写打印,集合本身元素不做任何改变)

		List<String> integers2 = Arrays.asList("a", "b", "c", "d");
        integers2.stream().map(s -> s.toUpperCase()).forEach(System.out::println);

匹配
1.allMatch 匹配其中所有元素,满足给定条件,返回true

List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
        Stream<Integer> stream = integers.stream();
        boolean b = stream.allMatch(new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                if (integer > 5) return true;
                else return false;
            }
        });
        System.out.println(b);

2.anyMatch 匹配其中只要有一个满足给定条件,返回true
3.noneMatch 没有一个匹配上给定条件,返回true

查找
1.findFirst() 找第一个

		List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
        Stream<Integer> stream = integers.stream();
		Optional<Integer> first = stream.findFirst();
        System.out.println(first.get());

2.findAny() 任意找一个
3.max() 找最大值

创建并行流,多线程

Stream<Integer> integerStream = integers.parallelStream();

归约
求和

		List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
        Stream<Integer> stream = integers.stream();

        Integer reduce = stream.reduce(0, new BinaryOperator<Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) {
                return integer + integer2;
            }
        });
        System.out.println(reduce);

对引用数据类型可以先提取在归约,map-reduce模式

收集
collect(Collectors.toList())
collect(Collectors.toSet())
collect(Collectors.tocollection(指定集合))

		List<Integer> integers = Arrays.asList(10, 20, 30, 40, 50, 60);
        Stream<Integer> stream = integers.stream();
        List<Integer> collect = stream.skip(1).limit(4).collect(Collectors.toList());
        System.out.println(collect);

一些注意事项详见网址


谢谢

Logo

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

更多推荐