Lambda表达式是Java 8中引入的一个重要特性。它允许我们将一个函数作为参数传递给另一个函数,从而简化代码并提高可读性。下面是一些Java Lambda表达式的使用技巧以及案例。
简化代码
使用Lambda表达式可以使代码更加简洁和易于阅读。例如,假设我们有一个字符串列表,并且我们想要打印每个字符串的长度。在Java 7中,我们可能会这样写:
List<String> strings = Arrays.asList("foo", "bar", "baz");
for (String s : strings) {
System.out.println(s.length());
}
但在Java 8中,我们可以使用Lambda表达式来简化此操作:
List<String> strings = Arrays.asList("foo", "bar", "baz");
strings.forEach(s -> System.out.println(s.length()));
函数式编程
Lambda表达式是函数式编程的基础。使用它们可以使代码更加模块化和可组合。例如,假设我们有一个数字列表,并且我们想要计算所有奇数的总和。在Java 7中,我们可能会这样写:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (int n : numbers) {
if (n % 2 != 0) {
sum += n;
}
}
但在Java 8中,我们可以使用Lambda表达式来更好地表达这个概念:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.filter(n -> n % 2 != 0)
.mapToInt(Integer::intValue)
.sum();
这段代码使用了Java 8中的Stream API和Lambda表达式来更加简洁地表示相同的操作。
并行处理
Lambda表达式可以轻松地实现并行处理。例如,如果我们有一个非常大的数字列表,并且我们想要计算所有奇数的总和,我们可以使用并行流来利用多核CPU。在Java 7中会这样写:
List<Integer> numbers = Arrays.asList(1, 2, 3, ..., 1000000);
int sum = 0;
for (int n : numbers) {
if (n % 2 != 0) {
sum += n;
}
}
但在Java 8中,我们可以使用Lambda表达式和并行流来更好地表达这个概念:
List<Integer> numbers = Arrays.asList(1, 2, 3, ..., 1000000);
int sum = numbers.parallelStream()
.filter(n -> n % 2 != 0)
.mapToInt(Integer::intValue)
.sum();
这段代码使用了Java 8中的parallelStream()方法来将流转换为并行流,并充分利用了多核CPU。
案例
下面是一些使用Lambda表达式的Java案例。
排序
Lambda表达式可以轻松地实现各种排序操作。例如,假设我们有一个字符串列表,并且我们想按长度对其进行排序。在Java 7中,我们可能会这样写:
List<String> strings = Arrays.asList("foo", "bar", "baz");
Collections.sort(strings, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
但在Java 8中,我们可以使用Lambda表达式来更加简洁地表示相同的操作:
List<String> strings = Arrays.asList("foo", "bar", "baz");
strings.sort((s1, s2) -> Integer.compare(s1.length(), s2.length()));
过滤
Lambda表达式还可以用于过滤操作。例如,假设我们有一个数字列表,并且我们只想保留所有小于10的数字。
通常需要使用for循环或者迭代器来对数字列表进行过滤操作。例如:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> filteredNumbers = new ArrayList<>();
for (Integer number : numbers) {
if (number < 10) {
filteredNumbers.add(number);
}
}
使用Lambda表达式可以将上述代码简化为:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> filteredNumbers = numbers.stream()
.filter(n -> n < 10)
.collect(Collectors.toList());
以上代码使用了Stream的filter()方法进行过滤操作,保留所有小于10的数字。最后使用collect()方法将结果收集到一个列表中。