赞
踩
Lambda 表达式是Java 8引入的一个重要特性,它旨在简化函数对象的创建过程,使得Java语言更加简洁、功能更加强大,尤其是在处理集合、流和并发编程中表现突出。Lambda允许将功能作为方法参数或将其赋值给变量,这在函数式编程范式中尤为重要,它促进了行为参数化,即代码可以根据传入的行为(函数)动态变化。
Lambda 表达式(Lambda expression)可以看作是一个匿名函数
Lambda表达式的语法结构一般为:
(parameters) -> expression
或者
(parameters) -> {
statements;
}
parameters
:一个或多个参数,参数之间用逗号分隔,无参数可留空。->
:箭头符号,表示“指向”,连接参数列表和主体。expression
:单个表达式,当Lambda体只有一条语句时可直接使用。{ statements; }
:当Lambda体包含多条语句时,需要用花括号包裹起来,并明确指定返回值(如果有的话)。// 1. 不需要参数,返回值为 2
() -> 2
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的和
(x, y) -> x + y
// 4. 接收2个int型整数,返回他们的乘积
(int x, int y) -> x * y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
函数式接口是只有一个抽象方法的接口,它是Lambda表达式的基础。Java 8引入了@FunctionalInterface
注解来标记这类接口,但即使没有这个注解,只要满足条件的接口也可以作为Lambda的目标类型。
Consumer<T>
:接收一个输入参数并执行操作,无返回值。Supplier<T>
:无参,产生一个结果。Predicate<T>
:接收一个输入参数,返回一个布尔值。UnaryOperator<T>
:一元操作符,输入和输出类型相同。BinaryOperator<T>
:二元操作符,输入和输出类型相同。 Function接口代表一个接受一个输入参数,产生一个输出的函数。它有一个抽象方法R apply(T t)。
示例:将字符串转换为大写。
Function<String, String> toUpperCase = String::toUpperCase;
String result = toUpperCase.apply("hello world");
System.out.println(result); // 输出: HELLO WORLD
Consumer接口代表一个接收单个输入参数并且无返回的操作。它有一个抽象方法void accept(T t)。
示例:打印字符串。
Consumer<String> printer = System.out::println;
printer.accept("This is an example of using Consumer."); // 直接打印字符串
Supplier接口不接受任何参数,但它可以提供一个结果。它有一个抽象方法T get()。
示例:生成随机数。
Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);
System.out.println(randomSupplier.get()); // 输出一个0到99之间的随机数
Predicate接口代表一个布尔值条件,它接受一个输入参数并返回一个布尔值结果。它有一个抽象方法boolean test(T t)。
示例:检查字符串是否为空。
Predicate<String> isEmpty = String::isEmpty;
System.out.println(isEmpty.test("")); // 输出: true
System.out.println(isEmpty.test("not empty")); // 输出: false
UnaryOperator是一个特殊的Function,它的输入和输出类型相同。
示例:自增操作。
UnaryOperator<Integer> increment = x -> x + 1;
System.out.println(increment.apply(10)); // 输出: 11
BinaryOperator也是一个特殊的Function,用于两个相同类型的操作数,并产生相同类型的结果。
示例:两个整数相加。
BinaryOperator<Integer> add = Integer::sum;
System.out.println(add.apply(5, 3)); // 输出: 8
//无参
@FunctionalInterface
interface RandomSupplier {
int getRandom();
}
//一个参数
@FunctionalInterface
interface SquareFunction {
int square(int number);
}
//两个参数
@FunctionalInterface
interface MaxFinder {
int findMax(int a, int b);
}
public static void main(String[] args) {
RandomSupplier r = () -> new Random().nextInt(100);
System.out.println(r.getRandom()); // 输出一个0到99的随机数
SquareFunction square = number -> number * number;
System.out.println(square.square(5)); // 输出: 25
MaxFinder maxFinder = (a, b) -> Math.max(a, b);
System.out.println(maxFinder.findMax(10, 20)); // 输出: 20
}
//无参
@FunctionalInterface
interface NoReturnAction {
void performAction();
}
//一个参数
@FunctionalInterface
interface SingleParamAction<T> {
void execute(T param);
}
//两个参数
@FunctionalInterface
interface DualParamAction<T, U> {
void apply(T first, U second);
}
public static void main(String[] args) {
NoReturnAction greetUser = () -> System.out.println("欢迎来到我们的平台!");
greetUser.performAction(); // 执行动作
SingleParamAction<String> logMessage = message -> System.out.println("记录信息: " + message);
logMessage.execute("用户登录事件"); // 执行动作并传递参数
DualParamAction<String, Integer> processOrder = (item, quantity) ->
System.out.println("处理订单: " + item + ", 数量: " + quantity);
processOrder.apply("苹果", 10); // 执行动作并传递两个参数
}
1.所需类型
2.使用限制不同
3.使用原理不同
public class LambdaVsAnonymous {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用Lambda表达式遍历列表并打印元素
names.forEach(name -> System.out.println(name));
System.out.println("------------------------------");
// 使用匿名内部类遍历列表并打印元素
names.forEach(new Consumer<String>() {
@Override
public void accept(String name) {
System.out.println(name);
}
});
// 使用匿名内部类实例化抽象类Shape
Shape shape = new Shape() {
@Override
void draw() {
System.out.println("绘制形状");
}
};
// 调用抽象方法
shape.draw();
}
}
abstract class Shape {
abstract void draw();
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。