JDK8 新特性(七)

50 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Stream API

概述

  • JDK 8 有两个重大的改变。第一个是 Lambda 表达式,另外一个是 Stream API 。
  • Stream API (java.util.stream) 将真正的函数式编程风格引入到 Java 中。这是目前为止对 Java 类库最好的补充,因为 Stream API 可以极大的提高 Java 程序员的生产力,让程序员写出高效、干净、简洁的代码。
  • Stream 是 JDK 8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,当然,也可以使用 Stream API 来并行执行操作。换言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
  • Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,负责存储数据,Stream 流讲的是计算,负责处理数据!”。

注意:

  • ① Stream 自己不会存储元素。
  • ② Stream 不会改变源对象,每次处理读会返回一个持有结果的新的 Stream 。
  • ③ Stream 操作是延迟执行的,意味着会等到需要结果的时候才执行。

Stream 流的操作步骤

  • ① 创建 Stream :通过一个数据源(如:集合、数组),获取一个流。
  • ② 中间操作:中间操作是个操作链,对数据源的数据进行 n 次处理,但是在终结操作前,并不会真正的执行。
  • ③ 终止操作:一旦执行终止操作,就执行中间操作链,最终产生结果并结束 Stream 。

创建 Stream

通过集合创建 Stream

  • JDK 8 中的 Collection 接口新增了两个获取流的方法:
  • 获取一个顺序流: default Stream stream() {}
  • 获取一个并行流:default Stream parallelStream() {}

示例:

    package com.github.stream.demo1;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        // 获取顺序流
        Stream<Integer> stream = list.stream();
        stream.forEach(System.out::println);
    }
}

通过数组创建 Stream

  • JDK 8 中的 Arrays 新增了静态方法,用来获取 Stream 流: public static Stream stream(T[] array) {}
  • 重载形式,能够处理对应基本类型的数组:
  • 获取一个整型数据流: public static IntStream stream(int[] array) {}
  • 获取一个长整型数据流: public static LongStream stream(long[] array) {}
  • 获取一个浮点型数据流: public static DoubleStream stream(double[] array) {} 示例:
    package com.github.stream.demo2;

import java.util.Arrays;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        String[] arr = {"PHP", "is", "the", "best", "language", "in", "the", "world"};

        Stream<String> stream = Arrays.stream(arr);

        stream.forEach(System.out::println);
    }
}