【Java】Lambda表达式
【Java】函数式编程
Lambda表达式格式
- 参照类型可推导 eg:(Integer a, Integer b) -> {return a + b;};
- 单行可省略大括号 eg:(a, b) -> a + b;
- 单参数可省略小括号 eg:a -> a + a;
- 没有参数的时候不可以省略小括号 eg:() -> 1;
private static BiFunction<Integer,Integer,Integer> biFunction = (Integer a, Integer b) -> {return a + b;};
private static BiFunction<Integer,Integer,Integer> biFunction2 = (a, b) -> a + b;
private static Function<Integer,Integer> function = a -> a + a;
private static Supplier<Integer> supplier = () -> 1;
函数式接口SAM
函数式接口是一种包含单一抽象方法(single abstract method)的接口。类通过为接口中的所有方法提供实现来实现任何接口,这可以通过顶级类(top-level class)、内部类甚至匿名内部类完成。
内置常用函数式接口
输入 | 返回值 | class | descript |
---|---|---|---|
T | R | Function<T,R> | 一个输入类型一个输出类型 |
void | T | Supplier |
没有输入,又一个返回类型 |
T | void | Consumer |
一个输入类型,没有返回 |
void | void | Runnable | 没有输入,没有返回 |
T | Boolean | Predicate |
有一个输入类型,又一个Boolean类型的返回 |
T | T | UnaryOperator |
有一个输入和一个返回,两者类型相同 |
1、示例 1
public class RunnableDemo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(
"inside runnable using an anonymous inner class");
}
}).start();
}
}
匿名内部类
使用lambda表达式
new Thread(()-> System.out.println("inside runnable using an anonymous inner class")).start();
将 lambda 表达式赋给变量
Runnable r =
()-> System.out.println("inside runnable using an anonymous inner class");
new Thread(r).start();
2、示例2
FilenameFilter 的匿名内部类实现
File directory = new File("./src/main/java");
String[] names = directory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
System.out.println(Arrays.asList(names));
FilenameFilter 接口的 lambda 表达式实现
File directory = new File("./src/main/java");
String[] names = directory.list((dir, name) -> name.endsWith(".java"));
System.out.println(Arrays.asList(names));
}
具有显式数据类型的 lambda 表达式
File directory = new File("./src/main/java");
String[] names =
directory.list((File dir, String name) -> name.endsWith(".java"));
lambda 代码块
File directory = new File("./src/main/java");
String[] names = directory.list((File dir, String name) -> {
return name.endsWith(".java");
});
System.out.println(Arrays.asList(names));
lambda 表达式的实现多于一行,则需要使用大括号和显式返回语句。
这就是 lambda 代码块(block lambda)。在本例中,虽然代码主体只有一行,但可以使用大括号将多个语句括起来。注意,不能省略 return 关键字。
好学若饥,谦卑若愚
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?