【Java知识】java基础-lambda语法详细说明
Lambda语法
- 语法说明
- 基本语法
- 组成部分
- 示例
- 注意事项
- 使用场景
- 使用stream api操作集合的详细说明
- 创建 Stream
- Stream 操作
- 中间操作
- 终端操作
- 并行 Stream
语法说明
Java 中的 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数语法,它允许你以表达式的方式实现函数式接口的实例。Lambda 表达式主要用于简化集合操作和事件处理等场景。
基本语法
Lambda 表达式的基本语法如下:
(parameters) -> expression
或者更复杂的代码块:
(parameters) -> {// 代码块
}
组成部分
- 参数:Lambda 表达式可以没有参数,也可以有一个或多个参数。参数的类型可以显式声明,也可以省略(类型推断)。
- 箭头:箭头
->
将参数和 Lambda 体分开。 - Lambda 体:Lambda 体是 Lambda 表达式的主要部分,可以是一个表达式或一个代码块。
示例
以下是一些 Lambda 表达式的示例,展示了不同类型的参数和 Lambda 体:
- 无参数 Lambda 表达式:
Runnable runnable = () -> System.out.println("Hello, Lambda!");
runnable.run();
- 单个参数 Lambda 表达式:
Consumer<String> consumer = (String s) -> System.out.println(s);
consumer.accept("Hello, Lambda!");
- 多个参数 Lambda 表达式:
BinaryOperator<Integer> add = (Integer a, Integer b) -> a + b;
int result = add.apply(5, 3);
- 带有类型推断的 Lambda 表达式:
Comparator<String> comparator = (s1, s2) -> s1.compareTo(s2);
- 带有代码块的 Lambda 表达式:
Runnable runnable = () -> {System.out.println("Hello, Lambda!");System.out.println("Another line.");
};
runnable.run();
注意事项
- 如果 Lambda 表达式体只有一条语句,可以省略大括号和
return
关键字(编译器会自动推断)。 - Lambda 表达式可以捕获外围作用域中的变量(称为“闭包”),但这些变量必须是最终(final)或事实上最终的(effectively final)。
- Lambda 表达式不能包含在 Java 中定义为抛出检查型异常的方法签名中。
使用场景
Lambda 表达式常用于以下场景:
- 实现函数式接口的实例。
- 作为参数传递给方法。
- 在 Stream API 中进行集合操作。
- 事件处理,如 GUI 编程中的事件监听器。
Lambda 表达式的引入极大地简化了 Java 的函数式编程,使得代码更加简洁和表达性更强。
使用stream api操作集合的详细说明
Java 8 引入的 Stream API 提供了一种高效且易于理解的方式来处理集合数据。Stream API 支持对集合进行多种操作,如筛选、转换、聚合等,且这些操作可以串行或并行执行。
创建 Stream
Stream 可以通过多种方式创建:
-
从集合创建:
任何 Java 集合(如List
、Set
)都可以通过调用stream()
方法获得 Stream。List<String> list = Arrays.asList("a1", "a2", "b1", "c2", "c1"); Stream<String> stream = list.stream();
-
从值创建:
可以使用Stream.of
方法从一组值创建 Stream。Stream<String> stream = Stream.of("a1", "a2", "b1", "c2", "c1");
-
使用 Stream.builder():
可以使用Stream.builder()
构建 Stream,并添加多个元素。Stream<String> stream = Stream.builder().add("a1").add("a2").add("b1").add("c2").add("c1").build();
-
从数组创建:
可以使用Arrays.stream
方法从数组创建 Stream。String[] array = {"a1", "a2", "b1", "c2", "c1"}; IntStream stream = Arrays.stream(array, 0, 3);
-
使用 Stream.generate():
可以使用Stream.generate
方法生成无限 Stream。Stream<String> stream = Stream.generate(() -> "a1").limit(3);
Stream 操作
Stream 操作可以分为两类:
- 中间操作(Intermediate operations):返回一个新的 Stream,可以进行链式操作。
- 终端操作(Terminal operations):产生一个最终的结果或副作用,操作后 Stream 被消耗。
中间操作
-
filter:根据条件过滤元素。
stream.filter(s -> s.startsWith("a")).forEach(System.out::println);
-
map:将元素映射到另一种形式。
stream.map(String::toUpperCase).sorted().forEach(System.out::println);
-
flatMap:将多个 Stream 合并成一个 Stream。
Stream.of(Arrays.asList("a1", "a2"), Arrays.asList("b1", "c2")).flatMap(Collection::stream).forEach(System.out::println);
-
limit:限制 Stream 中元素的数量。
stream.limit(3).forEach(System.out::println);
-
sorted:将 Stream 中的元素进行排序。
stream.sorted().forEach(System.out::println);
终端操作
-
forEach:对每个元素执行操作。
stream.forEach(System.out::println);
-
collect:将 Stream 转换为其他形式,如集合。
List<String> collected = stream.collect(Collectors.toList());
-
reduce:通过某个连接动作将所有元素汇总成一个汇总结果。
Optional<String> reduced = stream.reduce((s1, s2) -> s1 + "#" + s2);
-
allMatch、anyMatch、noneMatch:检查 Stream 的元素是否与给定的谓词匹配。
boolean allStartsWithA = stream.allMatch(s -> s.startsWith("a"));
-
count:返回 Stream 中元素的数量。
long count = stream.count();
-
findFirst、findAny:返回 Stream 中的第一个或任意一个元素。
Optional<String> first = stream.findFirst();
并行 Stream
可以通过在 Stream 上调用 parallelStream()
方法来创建一个并行 Stream,它允许操作在多个线程上并行执行。
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.parallelStream().filter(s -> s.startsWith("a")).map(String::toUpperCase).sorted().forEach(System.out::println);
使用 Stream API 操作集合可以极大地提高代码的可读性和开发效率,同时它也为并行处理提供了便利。