跳到主要内容 Java Lambda 表达式详解 | 极客日志
Java java
Java Lambda 表达式详解 Java Lambda 表达式作为 Java 8 引入的函数式编程特性,主要用于简化匿名内部类的编写。内容涵盖 Lambda 基本语法、从匿名内部类到 Lambda 的演变、常用函数式接口(Runnable、Consumer、Supplier、Function、Predicate)的定义与场景。此外还包含方法引用的四种形式、Stream API 与 Lambda 的结合使用、集合操作示例以及在 MyBatis-Plus 中构建动态查询条件(LambdaQueryWrapper)的实际应用案例。
DockerOne 发布于 2026/2/21 更新于 2026/4/18 2 浏览
1、什么是 Lambda 表达式 Lambda 表达式是 Java 8 引入的函数式编程特性,用于简化匿名内部类的写法。
Lambda 表达式本质上是一个匿名函数(没有名字的函数) 。你可以把它理解为一小段可以传递的、即用即写的代码。
它的主要目的是为了简化代码 ,尤其是在需要使用匿名内部类的场景下,能让代码变得非常简洁、清晰。
2、基本语法 (parameters)-> expression
二、Lambda 表达式的演变
1、匿名内部类 → Lambda
Runnable runnable = new Runnable () {
@Override
public void run () {
System.out.println("Hello World" );
}
};
Runnable lambdaRunnable = () -> System.out.println("Hello World" );
2、各种形式的 Lambda
() -> System.out.println("Hello" );
(x) -> System.out.println(x);
x -> System.out.println(x);
(int x, int y) -> x + y;
(x, y) -> x + y;
(x, y) -> {
int result = x + y;
System.out.println("结果:" + result);
return result;
};
三、函数式接口
1、什么是函数式接口 只有一个抽象方法的接口,可以用作 Lambda 表达式的类型。
2、Java 内置的常用函数式接口
1. Runnable - '执行一个动作'
Runnable r = () -> System.out.println("Running" );
r.run();
new Thread (() -> System.out.println("在新线程中运行" )).start();
() -> {
System.out.println("第一件事" );
System.out.println("第二件事" );
};
2. Consumer - '消费一个数据' 作用 :吃进一个数据,消化掉(处理),不吐出来(不返回)
Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Hello World" );
List<String> names = Arrays.asList("Alice" , "Bob" , "Charlie" );
names.forEach(name -> System.out.println("你好," + name));
(数据) -> {
};
3. Supplier - '提供一个数据'
Supplier<String> supplier = () -> "Hello" ;
String result = supplier.get();
Supplier<Double> randomSupplier = () -> Math.random();
Supplier<LocalDateTime> timeSupplier = () -> LocalDateTime.now();
System.out.println(randomSupplier.get());
System.out.println(timeSupplier.get());
() -> {
return 产生的数据;
};
4. Function<T, R> - '转换数据'
Function<String, Integer> function = s -> s.length();
int length = function.apply("Hello" );
Function<String, String> toUpperCase = s -> s.toUpperCase();
Function<Integer, String> intToHex = i -> Integer.toHexString(i);
System.out.println(toUpperCase.apply("hello" ));
System.out.println(intToHex.apply(255 ));
(输入数据) -> {
return 加工后的数据;
};
5. Predicate - '判断条件'
Predicate<String> predicate = s -> s.isEmpty();
boolean result = predicate.test("" );
boolean result2 = predicate.test("Hi" );
Predicate<String> isLongWord = s -> s.length() > 5 ;
Predicate<Integer> isEven = n -> n % 2 == 0 ;
List<String> words = Arrays.asList("apple" , "banana" , "cat" , "elephant" );
words.stream()
.filter(isLongWord)
.forEach(System.out::println);
(数据) -> {
return 数据是否符合条件;
};
四、方法引用
1、方法引用的四种形式
Function<String, Integer> parser = Integer::parseInt;
String str = "Hello" ;
Supplier<Integer> lengthSupplier = str::length;
Function<String, String> upperCase = String::toUpperCase;
Supplier<List<String>> listSupplier = ArrayList::new ;
2、方法引用示例 List<String> names = Arrays.asList("Alice" , "Bob" , "Charlie" );
names.forEach(name -> System.out.println(name));
names.forEach(System.out::println);
List<Integer> numbers = Arrays.asList(1 , 2 , 3 );
numbers.stream()
.map(String::valueOf)
.forEach(System.out::println);
五、Stream API 与 Lambda
1、Stream 基础操作 List<String> names = Arrays.asList("Alice" , "Bob" , "Charlie" , "David" );
List<String> result = names.stream()
.filter(name -> name.length() > 3 )
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
2、常用 Stream 操作 List<Integer> numbers = Arrays.asList(1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 );
int sum = numbers.stream()
.filter(n -> n % 2 == 0 )
.map(n -> n * n)
.reduce(0 , Integer::sum);
Map<String, List<Person>> peopleByCity = people.stream()
.collect(Collectors.groupingBy(Person::getCity));
六、在集合操作中的应用
1、List 操作 List<String> list = new ArrayList <>();
list.add("Apple" );
list.add("Banana" );
list.add("Cherry" );
list.forEach(item -> System.out.println(item));
list.sort((a, b) -> a.compareTo(b));
list.sort(String::compareTo);
List<String> filtered = list.stream()
.filter(s -> s.startsWith("A" ))
.collect(Collectors.toList());
2、Map 操作 Map<String, Integer> map = new HashMap <>();
map.put("Alice" , 25 );
map.put("Bob" , 30 );
map.put("Charlie" , 35 );
map.forEach((name, age) -> System.out.println(name + ": " + age));
Map<String, String> nameLength = map.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> String.valueOf(entry.getValue())
));
七、在 MyBatis-Plus 中的应用
1、LambdaQueryWrapper
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper <>();
wrapper.eq(User::getName, "张三" )
.gt(User::getAge, 18 )
.like(User::getEmail, "@gmail.com" );
2、复杂条件构建 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper <>();
wrapper.and(w -> w
.eq(User::getStatus, 1 ).or()
.eq(User::getStatus, 2 ))
.or(w -> w
.gt(User::getAge, 60 ).lt(User::getAge, 18 ));
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online