接口的变化:接口中的方法可以有实现
1.接口中可以有静态方法,可以通过 接口名.方法名 调用。(通常会把返回接口对象的方法放到接口里)
2.接口中可以有默认方法,这类方法为公开的(public)方法,但要加上 default 修饰符,接口的实现类会默认继承此方法,若一个类实现了两个具有相同默认方法的接口,类中必须要对该默认方法进行覆盖,调用此方法的格式为: 接口名.super.方法名();
Lambda
语法:
注意:
示例:
(Student s)->{return s.getAge()>18;} (Student s)->s.getAge()>18 (s)->s.getAge()>18 s->s.getAge()>18
函数式接口:只有一个抽象方法的接口
常见函数式接口:
接口 | 函数描述符 | 方法名 |
---|---|---|
Predicate<T> 谓词 | T->boolean | test |
Consumer<T> 消费者 | T->void | accept |
Function<T,R> 函数 | T->R | apply |
Supplier<T> 提供者 | ()->T | get |
BiPredicate<T,R> | (T,R)->boolean | test |
BiConsumer<T,R> | (T,R)->void | accept |
BiFunction<T,U,R> | (T,U)->R | apply |
UnaryOperator<T> | T->T | apply |
BinaryOperator<T> | (T,T)->T | apply |
方法引用
进一步简化接口对象的创建及使用,向函数式编程靠近,使程序员的代码更简单,更直接,更直白,只需提供关键的数据及逻辑,其他靠编译器推理
Lambda | 方法引用 | |
---|---|---|
参数方法 | (A arg0, B rest)->arg0.method(rest) | A::method |
静态方法 | (args)->ClassName.method(args) | ClassName::method |
其他对象方法 | (args)->expr.method(args) | expr::method |
构造方法 | ()->new Student() | Student::new |
构造方法 | (String s)->new Student(s) |
参数化
开闭原则: 对扩展开放,对修改关闭
参数化的好处:提升共性代码的可重用性
行为参数化:进一步提高代码可用性
在java中只能通过接口定义代码参数(行为参数)
Runnable r1=new Runnable(){ public void run(){ System.out.println("匿名内部类"); } }; Runnable r2=()->{ System.out.println("lambda"); }; //方法引用 Arrays.asList("a","o","e").forEach(System.out::print);
1 lambda形参类型通常可以省略,但注意不要有歧义
2 如果lambda形参个数只有1个,且省略了形参类型 ,同时()也可以省略
3 如果lambda{}中只有一个语句,{}可以省略;
lambda只能实现只有1个抽象方法的接口(函数接口)
2 匿名内部类中this表示匿名内部类对象本身
lambda中this表示外部类对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具