java 新特性之 Stream API

强大的 Stream API一、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() : 返回一个并行流
【java 新特性之 Stream API】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. 筛选与切片
方 法描 述filter(Predicate p)接收 Lambda ,从流中排除某些元素distinct()筛选 , 通过流所生成元素的 hashCode() 和 equals() 去除重复元素limit(long maxSize)截断流,使其元素不超过给定数量skip(long n)跳过元素,返回一个扔掉了前 n 个元素的流 。若流中元素不足 n 个,则返回一个空流 。与 limit(n) 互补@Testpublic 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. 映射
方法描述map(Function f)接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 。mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 DoubleStream 。mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 IntStream 。mapToLong(ToLongFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的 LongStreamflatMap(Function f)接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流

推荐阅读