Lambda表达式是Java 8引入的一项重要特性,它允许您以一种更简洁的方式定义匿名函数(也称为闭包)。Lambda表达式是函数式编程的一部分,它提供了在Java中处理函数式接口的能力。函数式接口是一个只有一个抽象方法的接口。Lambda表达式通常用于函数式接口的实现,以便提供函数的实现。
以下是Lambda表达式的基本语法:
javaCopy code
(parameter1, parameter2, ...) -> expression
其中:
parameter1, parameter2, ...
是参数列表,您可以根据需要定义零个或多个参数。->
是Lambda运算符,它将参数列表与Lambda主体(expression)分开。expression
是Lambda表达式的主体,可以是一个单独的表达式或一个代码块。
下面是一些Lambda表达式的示例,以帮助您理解其用法:
- Lambda表达式作为一个函数式接口的实现:
javaCopy code
// 使用Lambda表达式实现Runnable接口 Runnable runnable = () -> System.out.println("Hello, Lambda!");
- Lambda表达式具有参数:
javaCopy code
// Lambda表达式接受两个整数参数并返回它们的和 (int a, int b) -> a + b
- Lambda表达式可以包含多个语句:
javaCopy code
// Lambda表达式使用代码块,计算两个数的和 (int a, int b) -> { int sum = a + b; System.out.println("Sum is: " + sum); return sum; }
- Lambda表达式可以引用外部变量:
javaCopy code
int factor = 2; Function<Integer, Integer> multiplier = n -> n * factor; System.out.println(multiplier.apply(5)); // 输出结果为10
- Lambda表达式可以在集合操作中使用:
javaCopy code
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.forEach(n -> System.out.println(n));
Lambda表达式的优势:
-
简化代码:Lambda表达式可以显著减少冗长的匿名内部类代码,使代码更加紧凑和易读。
-
支持函数式编程:它使Java能够更好地支持函数式编程,使操作集合、流和并行编程更容易。
-
可以更方便地传递行为:Lambda表达式可以作为参数传递给方法,使代码更具可扩展性和灵活性。
总之,Lambda表达式是Java 8引入的强大功能,可以使您的代码更加简洁和可读,尤其是在处理集合、并行编程和函数式编程方面。通过掌握Lambda表达式,您可以更好地利用Java中的新特性和编程范式。
Stream(流)是Java 8中引入的一个新特性,它提供了一种流式处理数据的机制。Stream可以从集合、数组、I/O等多种数据源中生成,它支持链式调用多个中间操作和一个终端操作(Terminal Operation),最终将数据流转换成一个结果或生成一个新的数据集合。
Stream 的特性:
- 一次性消费,只能遍历一次
- 惰性求值,只有遇到终止操作才会执行中间操作
- 可以并行操作
Stream的生成方式:
从 Collection 和数组
- collection.stream()
- collection.parallelStream()
- Arrays.stream(T[] array)
- Stream.of(T... values)
从 BufferedReader
- BufferedReader.lines()
从文件生成流:
- Files.lines(Path path)
- Files.list(Path path)
- Files.walk(Path path)
从函数生成流:
- Stream.generate(Supplier<T> s)
- Stream.iterate(T seed, UnaryOperator<T> f)
Stream 的中间操作:
- filter()
- map()
- flatMap()
- distinct()
- sorted()
- peek()
- limit()
- skip()
Stream 的终止操作:
- forEach()
- toArray()
- reduce()
- collect()
- min()
- max()
- count()
- anyMatch()
- allMatch()
- noneMatch()
- findFirst()
- findAny()
Stream 的操作类型:
- Intermediate:产生一个新的 Stream。
- Terminal:产生一个非 Stream 的值。
- Short-circuiting:对于一个无限大的 Stream,只有满足某些条件时才会产生最终的结果,否则会无限等待下去。
Stream 的优点:
- 可以提高代码的可读性和简洁性。
- 能够更加高效地操作数据。
- 可以并行处理数据,提高运行效率。
Stream 的缺点:
- 较长的学习周期和适应期。
- 不能重复使用,只能进行一次遍历。
- 在某些情况下可能会导致性能降低,例如数据量较少,使用 Stream 反而会比常规方式运行得更慢。