一、Stream的创建

通过数组创建Stream

String[] names = {"zhangsan", "lisi", "wuangwu", "zhaoliu"};
Stream<String> stream = Stream.of(names);
stream.skip(3).forEach(System.out::println);

通过集合创建Stream

Stream<Integer> streamOne = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0).stream();

streamOne.filter(x->x%2==0).forEach(System.out::println);

通过Generate创建Stream 无限的产生

Stream<Integer> integerStream = Stream.generate(() -> 3);
integerStream.limit(10).forEach(System.out::println);

通过iterate创建Stream 无限的产生

Stream<Integer> streamTwo = Stream.iterate(1, (x) -> x + 1);
streamTwo.limit(10).forEach(System.out::println);

String strs = "this is test for java stream api";
IntStream intStream = strs.chars();
intStream.forEach(System.out::println);
System.out.println((char)116);

Stream

  • A sequence of elements supporting sequential and parallel aggregate operations
  • Stream 是一组用来处理数组、集合的API
  • 引入函数式编程的原因
  • 代码简洁:函数式编程写出的代码简洁且意图明确,使用Stream接口让你从此告别for循环
  • 多核友好:java函数式编程使得编写并行程序如此简单,你需要的全部就是调用一下parallel方法。

Stream的特性

  • 不是数据结构、没有内部存储
  • 不支持索引访问
  • 延迟计算
  • 支持并行
  • 很容易生成数组和集合(List,Set)
  • 支持过滤、查找、转换、汇总、聚合等操作

Stream的运行机制

  • Stream分为源source、中间操作、终止操作
  • 流的源可以是一个数组、一个集合、一个生成器方法、一个I/O通道等等
  • 一个流可以有零个和或者多个中间操作,每个中间操作都会返回一个新的流,供下一个流使用,一个流只会有一个终止操作
  • stream只有遇到终止操作、它的源才开始执行遍历操作。

Stream的常用API

  • 中间操作
  • 过滤 filter
  • 去重 distinct
  • 排序 sorted
  • 截取 limit skip
  • 转换 map flatMap
  • 其他 peek
  • 终止操作
  • 循环 forEach
  • 计算 min max count average
  • 匹配 anyMatch allMatch noneMatch findFirst findAny
  • 汇聚 reduce
  • 收集器 toArray collect
  • Stream的创建
  • 通过数组
  • 通过集合来
  • 通过Stream.generate
  • 通过Stream。iterate
  • 其他API创建

方法的引用

方法的引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法的引用提供了一种引用而不执行方法的方式。如果抽象方法的实现恰好可以使用调用另外一个方法来实现。就有可能可以使用方法引用。因此,本质其实是采用lambda函数的方式实现了一个函数式接口,只不过实现的方式是另一个函数,我们只需要指定一下。

静态方法引用:类名::staticMethod 如果函数式接口的实现巧合可以通过调用一个静态方法来实现,那么就可以使用静态方法的引用。
实例方法引用:Instance::InstanceMethod 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法的引用。
对象方法引用:类名::instanceMethod 抽象方法的第一参数类型刚好是实例方法的类型,抽象方法的剩余的参数恰好可以当做实例方法的参数。如果函数式接口的实现能有上面说的实例方法调用来实现的话,那么就可以使用对象方法的引用
构造方法的引用:类名::new 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法的引用