一、前言
lambda表达式是java 8引入的新特性之一,它极大地简化了代码,特别是在处理集合和使用函数式接口时。
通过lambda表达式,我们可以将函数作为参数传递,提高了代码的简洁性和可读性。
本文将介绍lambda表达式的语法、应用场景以及常见用法。
二、lambda表达式概述
1. 什么是lambda表达式?
lambda表达式是一种匿名函数,用于简化对接口的实现。
在没有lambda之前,我们通常通过匿名内部类的方式来实现接口,而使用lambda可以用更简洁的方式表示。
lambda表达式的语法:
(参数列表) -> { 方法体 }
语法解析:
()
:参数列表,可以为空或包含多个参数。->
:lambda操作符,表示将参数传递给方法体。{}
:方法体,包含具体实现逻辑。若方法体只有一行语句,可以省略大括号和return
关键字。
lambda表达式与匿名内部类的对比:
使用匿名内部类
list<string> list = arrays.aslist("java", "python", "c++"); collections.sort(list, new comparator<string>() { @override public int compare(string s1, string s2) { return s1.compareto(s2); } }); system.out.println(list);
使用lambda表达式
list<string> list = arrays.aslist("java", "python", "c++"); list.sort((s1, s2) -> s1.compareto(s2)); system.out.println(list);
使用lambda表达式后,代码简洁了很多。
三、lambda表达式的语法规则
1. 无参数的lambda表达式
如果方法没有参数,可以使用空括号:
runnable runnable = () -> system.out.println("无参数的lambda表达式"); new thread(runnable).start();
2. 单个参数的lambda表达式
如果只有一个参数,可以省略括号:
consumer<string> consumer = s -> system.out.println(s); consumer.accept("单个参数的lambda表达式");
3. 多个参数的lambda表达式
有多个参数时,需要使用括号:
bifunction<integer, integer, integer> sum = (a, b) -> a + b; system.out.println(sum.apply(5, 10));
4. 方法体只有一行代码时,可以省略{}和return
function<integer, integer> square = x -> x * x; system.out.println(square.apply(4));
5. 方法体有多行代码时,需要使用{}和return
bifunction<integer, integer, integer> multiply = (a, b) -> { int result = a * b; system.out.println("结果:" + result); return result; }; multiply.apply(3, 4);
四、函数式接口与lambda表达式
1. 什么是函数式接口?
函数式接口是只包含一个抽象方法的接口,可以使用@functionalinterface
注解进行标记。lambda表达式可以简化对函数式接口的实现。
自定义函数式接口示例
@functionalinterface public interface myfunctionalinterface { void show(); }
使用lambda表达式实现:
myfunctionalinterface myinterface = () -> system.out.println("lambda实现函数式接口"); myinterface.show();
2. java内置函数式接口
java提供了许多内置的函数式接口,常用的有:
consumer<t>
:消费型接口,有入参无返回值。supplier<t>
:供给型接口,无入参有返回值。function<t, r>
:函数型接口,有入参有返回值。predicate<t>
:断言型接口,返回布尔值。
示例:
import java.util.function.*; public class lambdademo { public static void main(string[] args) { // consumer示例 consumer<string> consumer = s -> system.out.println("消费:" + s); consumer.accept("java"); // supplier示例 supplier<string> supplier = () -> "提供数据"; system.out.println(supplier.get()); // function示例 function<integer, string> function = i -> "数字:" + i; system.out.println(function.apply(10)); // predicate示例 predicate<integer> predicate = n -> n > 5; system.out.println(predicate.test(10)); } }
五、lambda表达式在集合中的应用
1. list遍历
使用lambda表达式简化遍历:
list<string> list = arrays.aslist("java", "python", "c++"); // 普通遍历 for (string item : list) { system.out.println(item); } // 使用lambda表达式 list.foreach(s -> system.out.println(s));
2. map遍历
map<string, integer> map = new hashmap<>(); map.put("java", 1); map.put("python", 2); map.put("c++", 3); // lambda遍历map map.foreach((k, v) -> system.out.println(k + " -> " + v));
3. stream流操作
lambda表达式与stream
流结合,可以实现简洁的数据处理:
list<integer> numbers = arrays.aslist(1, 2, 3, 4, 5, 6, 7, 8); // 筛选偶数并计算平方 list<integer> squares = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * n) .collect(collectors.tolist()); system.out.println(squares);
六、lambda表达式的注意事项
变量引用:lambda表达式中引用外部变量时,该变量必须是final
或等效于final
的(即不可被修改)。
int num = 10; runnable r = () -> system.out.println(num); r.run();
不可以在lambda表达式内修改num
的值。
异常处理:lambda表达式中可以抛出异常,但需要在接口方法中声明异常。
@functionalinterface interface throwingconsumer<t> { void accept(t t) throws exception; }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论