模式切换
版本特性篇
说说你对 Lambda 表达式的理解
Lambda 表达式是 Java 8 引入的一种新特性,用于表示匿名函数。它可以作为参数传递给方法或函数接口,并且可以在需要函数式变成特性的地方使用,是函数式编程的具体实现。
Lambda 表达式的愈发类似于:(参数列表) -> 表达式或代码块。参数列表描述了输入参数,可以省略类型,甚至小括号。箭头符号将参数列表与表达式或代码块分隔开来。
Lambda 表达式的主要特点有:
- 简洁:相较于传统的匿名内部类,Lambda 表达式可以更加简洁,减少样板代码。
- 函数式编程:支持函数作为参数传递,使得代码更加灵活,易于阅读和维护。
- 闭包:可以访问周围的变量和参数。
- 方法引用:可以通过引用已存在的方法进一步简化。
Lambda 的应用场景包括:
- 集合操作:如对集合进行过滤、映射、排序等操作。
- 并行编程:利用 Lambda 表达式简化并发编程的复杂性。
- 事件驱动模型:作为回调函数响应用户输入或系统事件。
Stream API
Stream API 是 Java 8 引入的一种处理集合的方式,它提供了一种声明式的方式来处理集合数据,可以更加简洁、高效地对集合进行操作。Stream API 提供了一系列的方法,可以对集合进行过滤、映射、排序、聚合等操作,使得代码更加简洁、易读。
- collect() 方法:将流中的元素转换为集合。如:List、Set、Map 等。
java
List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());
System.out.println(list); // [a, b, c]
- filter() 方法:根据指定条件过滤流中的元素。
java
List<String> list = Stream.of("a", "b", "c").filter(s -> s.equals("a")).collect(Collectors.toList());
System.out.println(list); // [a]
- map() 方法:对流中的元素进行映射,将元素映射为新的值。
java
List<String> list = Stream.of("a", "b", "c").map(s -> s.toUpperCase()).collect(Collectors.toList());
System.out.println(list); // [A, B, C]
- forEach() 方法:对流中的每个元素执行指定操作。
java
Stream.of("a", "b", "c").forEach(s -> System.out.println(s)); // a b c
- flatMap() 方法:将多个流合并为一个流。
java
List<String> list = Stream.of(Arrays.asList("a", "b"), Arrays.asList("c", "d")).flatMap(Collection::stream).collect(Collectors.toList());
System.out.println(list); // [a, b, c, d]
- reduce() 方法:对流中的元素进行归约操作,返回一个值。如:求和、求最大值、求最小值等。
java
int sum = Stream.of(1, 2, 3, 4).reduce(0, Integer::sum);
System.out.println(sum); // 10
- distinct() 方法:去除流中重复的元素。
java
List<String> list = Stream.of("a", "b", "a", "c").distinct().collect(Collectors.toList());
System.out.println(list); // [a, b, c]
- sorted() 方法:对流中的元素进行排序。
java
List<Integer> list = Stream.of(3, 1, 2).sorted().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
- limit() 方法:截取流中的前 n 个元素。
java
List<Integer> list = Stream.of(1, 2, 3, 4).limit(2).collect(Collectors.toList());
System.out.println(list); // [1, 2]
- skip() 方法:跳过流中的前 n 个元素。
java
List<Integer> list = Stream.of(1, 2, 3, 4).skip(2).collect(Collectors.toList());
System.out.println(list); // [3, 4]
- anyMatch() 方法:判断流中是否有任意一个元素满足指定条件。
java
boolean result = Stream.of(1, 2, 3).anyMatch(i -> i > 2);
System.out.println(result); // true
- allMatch() 方法:判断流中是否所有元素都满足指定条件。
java
boolean result = Stream.of(1, 2, 3).allMatch(i -> i > 0);
System.out.println(result); // true
- noneMatch() 方法:判断流中是否所有元素都不满足指定条件。
java
boolean result = Stream.of(1, 2, 3).noneMatch(i -> i < 0);
System.out.println(result); // true
- findFirst() 方法:获取流中的第一个元素。
java
Optional<Integer> result = Stream.of(1, 2, 3).findFirst();
System.out.println(result.get()); // 1
- findAny() 方法:获取流中的任意一个元素。
java
Optional<Integer> result = Stream.of(1, 2, 3).findAny();
System.out.println(result.get()); // 1
- min() 方法:获取流中的最小值。
java
Optional<Integer> result = Stream.of(3, 1, 2).min(Integer::compareTo);
System.out.println(result.get()); // 1
- max() 方法:获取流中的最大值。
java
Optional<Integer> result = Stream.of(3, 1, 2).max(Integer::compareTo);
System.out.println(result.get()); // 3
- groupBy() 方法:根据指定条件对流中的元素进行分组。
java
Map<Integer, List<Integer>> map = Stream.of(1, 2, 3, 4).collect(Collectors.groupingBy(i -> i % 2));
System.out.println(map); // {0=[2, 4], 1=[1, 3]}
- partitioningBy() 方法:根据指定条件对流中的元素进行分区。
java
Map<Boolean, List<Integer>> map = Stream.of(1, 2, 3, 4).collect(Collectors.partitioningBy(i -> i % 2 == 0));
System.out.println(map); // {false=[1, 3], true=[2, 4]}