Lambda表达式与Stream

发布 | 2024-08-09 | JAVA

什么是 Lambda 表达式?

Lambda 表达式是 Java 8 引入的一种新特性,它是一种简洁的表示能够传递的代码块。Lambda 表达式可以表示一个函数接口的实现。函数接口是只包含一个抽象方法的接口,例如 RunnableComparator 或 Java 8 引入的 java.util.function 包中的接口。

Lambda 表达式的语法

(parameters) -> expression
或
(parameters) -> { statements; }

示例

// 不带参数的Lambda表达式
Runnable r = () -> System.out.println("Hello Lambda!");

// 带一个参数的Lambda表达式
Consumer<String> consumer = (s) -> System.out.println(s);

// 带有两个参数和返回值的Lambda表达式
Comparator<Integer> comparator = (a, b) -> Integer.compare(a, b);

使用 Lambda 表达式的场景

  • 简化匿名内部类的使用: Lambda 表达式提供了一种简化写法,替代冗长的匿名内部类。
  • 配合函数式接口: 可以与 java.util.function 包中的函数式接口配合使用,例如 PredicateFunctionConsumerSupplierUnaryOperator 等。

Java Stream API

什么是 Stream?

Stream 是 Java 8 中引入的一种新特性,它是一种用来处理集合数据的高级抽象。Stream 可以进行非常复杂的数据操作,例如过滤、排序、映射、归约等,能够更简洁、方便地进行集合操作。

Stream 的使用步骤

  1. 创建 Stream: 可以通过集合、数组、文件等多种方式创建一个 Stream。
  2. 中间操作: 对 Stream 进行一系列转换(如 filtermapsorted 等),这些操作是懒执行的。
  3. 终端操作: 对 Stream 进行最终操作(如 forEachcollectreduce 等),触发所有中间操作的执行。

示例代码

List<String> list = Arrays.asList("java", "c", "python", "c++", "VB", "C#");

// 使用Stream进行过滤和遍历
list.stream()
    .filter(s -> s.length() > 2)
    .forEach(System.out::println);

常用的 Stream 操作

  • filter(Predicate) 对元素进行过滤。
  • map(Function) 将每个元素转换为另一种类型。
  • sorted(Comparator) 对元素进行排序。
  • collect(Collector) 将 Stream 转换为集合、数组等。
  • reduce(BinaryOperator) 归约操作,将所有元素根据给定的规则合并为一个结果。

结合使用 Lambda 表达式与 Stream

Lambda 表达式通常与 Stream API 一起使用,可以让代码更简洁、易读。例如:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// 使用Stream API和Lambda表达式筛选和转换数据
List<String> result = names.stream()
    .filter(name -> name.startsWith("A"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

System.out.println(result); // 输出: [ALICE]

常见的函数式接口

  • Predicate<T> 接收一个参数,返回一个布尔值结果。

    Predicate<String> isLongerThan5 = s -> s.length() > 5;
  • Consumer<T> 接收一个参数,无返回值。

    Consumer<String> print = s -> System.out.println(s);
  • Function<T, R> 接收一个参数,返回一个结果。

    Function<String, Integer> length = s -> s.length();
  • Supplier<T> 无参数,返回一个结果。

    Supplier<String> supplier = () -> "Hello";
  • UnaryOperator<T> 接收一个参数,返回一个相同类型的结果。

    UnaryOperator<String> toUpperCase = s -> s.toUpperCase();

标签
Lambda,Stream

© 著作权归作者所有

本文由 趣代码Blog 创作,采用 知识共享署名4.0 国际许可协议进行许可,本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。

评论关闭