Lambda

  • Java8 开始支持Lambda 表达式,让程序编写更简洁、优雅
  • 利用 Lambda 表达式可以更简洁的实现匿名内部类和函数声明与调用
  • Lambda 使得 Stream 流式编程为操作集合提供便利

Lambda 表达式语法结构

  • (参数列表) -> 实现语句
public static void main(String[] args) {
        // 标准使用方式
        MathOperation operation = (double a, double b) -> {
            System.out.println("加法运算");
            return a + b;
        };
        System.out.println(operation.opt(1, 3));

        // Lambda 允许忽略参数类型
        MathOperation operation1 = (a, b) -> {
            return a - b;
        };
        System.out.println(operation1.opt(4, 1));

        // 单行代码可以省略方法体和 return 语句
        MathOperation operation2 = (a, b) -> a * b;
        System.out.println(operation2.opt(2, 5));
    }

函数式编程

  • 基于函数式接口并使用 Lambda 表达式的编程方式
  • 函数式编程的理念是将代码作为可重用数据代入到程序运行中

函数式接口

  • 有且仅有一个抽象方法的接口
  • Java8 提供了一系列新的函数式接口,位于java.util.function包中
  • Predicate用于判断传入的数据是否满足要求,使用test()方法进行逻辑判断
  1. java.util.function.Predicate :用于条件判断,返回 Boolean 值
  2. java.util.function.Consumer:对应只有一个输入参数,而不需要返回的情况
  3. java.util.function.Function:对应一个输入参数,且返回数据的情况

Stream

  • Stream流式处理是建立在 Lambda 表达式基础上的多数据处理技术
  • Stream 对集合数据处理高度抽象,极大简化代码量
  • Stream 可以对集合数据进行迭代、去重、筛选、排序、聚合等操作
  • 位于java.util.stream.Stream

创建流的五种方式

  • 基于数组创建

    String[] arr = {"lili", "mark", "jackson"};
    Stream<String> stringStream = Stream.of(arr);
    stringStream.forEach(System.out::print);
    
  • 基于集合创建

    List<String> list = new ArrayList<>();
    list.add("123");
    list.add("345");
    Stream<String> stream = list.stream();
    stream.forEach(System.out::println);
    
  • 使用 generate 方法创建

    Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100000)).limit(100);
    generate.forEach(System.out::print);
    System.out.println();
    
  • 使用迭代器创建

    Stream<Integer> limit = Stream.iterate(1, n -> n + 1).limit(100);
    limit.forEach(System.out::print);
    
  • 使用字符序列创建

    String string = "abcdefg";
    IntStream chars = string.chars();
    chars.forEach(System.out::println);