一、Stream API 的概述

  1. Stream到底是什么呢?
    是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
    “集合讲的是数据,Stream讲的是计算!”
  • Stream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
  • Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
  1. Stream 的操作三个步骤
  • 创建 Stream
    一个数据源(如:集合、数组),获取一个流
  • 中间操作
    一个中间操作链,对数据源的数据进行处理
  • 终止操作(终端操作)
    一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

二、Stream API 的创建

  1. 创建 Stream方式一:通过集合
    Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:
  • default Stream< E > stream() : 返回一个顺序流
  • default Stream< E > parallelStream() : 返回一个并行流
public class testStream {
	@Test
	public void test() {
		List<String> list = new ArrayList();
		list.add("张三");
		list.add("李四");
		Stream<String> stream = list.stream(); //获取串行流
		Stream<String> stream1 = list.parallelStream(); //获取并行流
		//终止操作,打印流。
		stream.forEach(System.out::println);
		stream.forEach(Sustem.out::println);
	}
}
  1. 创建 Stream方式二:通过数组
    Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:
  • static < T > Stream< T > stream(T[] array): 返回一个流
public class testStream {
	@Test
	public void test() {
		int[] emps = new int[]{1, 2, 3, 4, 5, 6}; //创建数组
		IntStream stream = Arrays.stream(emps);
		//终止操作,打印流。
		stream.forEach(System.out::println);
	}
}
  1. 创建 Stream方式三:通过Stream的of()
    可以调用Stream类静态方法 of()方法, 通过显示值创建一个流。它可以接收任意数量的参数。
  • public static< T > Stream< T > of(T... values) : 返回一个流
public class testStream {
	@Test
	public void test() {
		Stream<String> stream = Stream.of("a","b","c");
		//终止操作,打印流。
		stream.forEach(System.out::println);
	}
}
  1. 创建 Stream方式四:创建无限流
    可以使用静态方法 Stream.iterate() 和 Stream.generate(), 创建无限流。
  • 迭代
    public static< T > Stream< T > iterate(final T seed, final UnaryOperator< T > f)
  • 生成
    public static< T > Stream< T > generate(Supplier< T > s)
public class testStream {
	@Test
	public void test() {
		//生成
		Stream<Double> stream = Stream.generate(Math::random);
		//终止操作,打前 10 个印流。
		stream.limit(10).forEach(System.out::println);
		//迭代
		Stream<Integer> stream1 = Stream.iterate(0,(x) -> x + 2);
		//终止操作,打前 10 个印流。
		stream1.limit(10).forEach(System.out::println);
	}
}

二、Stream API 的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

  1. 筛选与切片
    @Test
    public void test() {
        //迭代,创建无限流
        Stream<Integer> stream = Stream.iterate(0,(x) -> x + 2);
        //获取大于4的数
        Stream<Integer> stream1 = stream.filter((x) -> x > 4);
        //获取大于4中的前10个数
        Stream<Integer> stream2 = stream1.limit(10);
        //舍弃前5个数
        Stream<Integer> stream3 = stream2.skip(5);
        //终止操作
        stream3.forEach(System.out::println);
    }
  1. 映射
  1. 排序

Stream API 的终止操作

  • 终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如:List、Integer,甚至是 void 。
  • 流进行了终止操作后,不能再次使用。
  1. 匹配与查找
  1. 归约

map 和 reduce 的连接通常称为 map-reduce 模式,因 Google
用它来进行网络搜索而出名。

  1. 收集

Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)。
另外, Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表:

10-21 10:47