Java8 新功能简介

Java 8 新增了很多的功能和语法

Lambda

初识 Lambda 表达式

  • 基本语法
    • () -> {}
    • (Integer x, Integer y) -> { return x + y; }
    • (x, y) -> { return x + y; } 可以省略类型 Lambda 支持自动推导
    • (x, y) -> x + y 单行可以省略 return;
  • Lambda 可以简化冗长的代码 明确表达的意思

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 原来 我们在线程执行一行代码的时候至少需要4行代码新建一个匿名类
    new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("Lambda");
    }
    }).start();
    // 使用 Lambda 表达式 只需要一行即可 -> 是 Lambda 的语法
    new Thread(() -> System.out.println("Lambda")).start();
  • Lambda 表达式支持类型推导 不需要指定参数类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Map<String, Object> map = new HashMap<>();
    // 老方法循环
    for (Map.Entry entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
    }
    // 使用 forEach 循环
    map.forEach((String s, Object o) -> {
    System.out.println(s + ": " + o);
    });
    // 简写语法 当只有一行的时候 可以去掉括号
    map.forEach((String s, Object o) -> System.out.println(s + ": " + o));
    // 简写语法 可以忽略类型
    map.forEach((s, o) -> System.out.println(s + ": " + o));

Lambda 的相关接口和注解

  • 注解 @FunctionalInterface 表示这是一个函数式接口
  • 函数式接口基本都在 java.util.function 包下
  • 函数型接口
    • 特点 有入参 有出参
      • 接口 Function<T, R> BiFunction<T, U, R>
    • 用于 map flatMap 等处理函数
  • 消费型接口
    • 特点 有入参 没有出参
      • 类似接口 Consumer<T> BiConsumer<T, U>
    • 用于 forEach peek 等处理函数
  • 断言型接口
    • 特点 有入参 出参 Boolean 类型
      • 接口 Predicate<T> BiPredicate<T, U>
    • 用于 filter 等过滤函数
  • 供应型接口
    • 特点 没有入参 有出参
      • 接口 Supplier<T>
    • 用于生产类的函数

Stream 流处理

什么是 Stream

  • Stream 是元素的集合
  • Stream 支持顺序和并行对元素进行汇聚的操作

初识 Stream

  • 使用 Stream 处理一个数字列表

    1
    2
    List<Integer> nums = Arrays.asList(1, 2, 3);
    nums.stream().filter(num -> num != null).count();

    图片

    • 红色区域 创建了一个 Stream
    • 绿色区域 把一个 Stream 转换为另一个 Stream
    • 三色区域 聚合数据

如何创建 Stream

  • 在 Java8 中 所有实现了 java.util.Collection 接口的集合类 可以通过 stream() 方法转换为 Stream
    • 例如 Map List Set Queue
  • 数组类型和基础类型 可以通过 java.util.Arrays#stream(T[]) 方法转换为 Stream