网站首页 > java教程 正文
简介
lambda 表达式支持将代码块作为方法参数,lambda 表达式允许使用更简洁的代码来创建一个只有抽象方法的接口(这种接口被称为函数式接口)。
lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。我们先回顾下“匿名内部类”,在出现 Lambda 表达式之前,我们使用的方式如下:
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 接口的匿名内部类
Message msg = new Message() {
@Override
public void print() {
System.out.println("匿名类实现接口");
}
};
// 调用方法
msg.print();
}
}
再看一个线程的例子
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("do something.");
}
}
当出现了 Lambda 表达式之后,我们就可以使用一行代码来处理,我没有说错,就是一行代码就可以搞定。
线程的例子
Runnable r = () -> System.out.println("do something.");
自定义的例子
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 使用 Lambda 实现
Message msga = () -> System.out.println("使用 Lambda 实现");
msga.print();
}
}
看上去觉得完全不可思议,居然还可以这么玩。我们用 () ->的方式完成了匿名内部类的逻辑,并且方法居然还没有名字。
小结
Lambda 表达代替匿名内部类创建对象时,lambda 表达式的代码块将会代替实现抽象方法的方法体,lambda 表达式就相当于一个匿名方法。
从语法上面看,lambda 表达式的主要作用就是代替匿名内部类的繁琐语法,它由三部分组成:
- (形参列表) 形参列表。形参列表允许省略形参类型。如果只有一个参数,甚至可以省略括号。
- -> 箭头。必须通过英文中画线和大于符号组成。
- 代码块:
如果代码块只包含一条语句,lambda 表达式允许省略代码块的 {}
如果代码块只有一条 return 语句,甚至可以省略 return 关键字
基础语法
对于 lambda 表达式有三种语法格式
- () -> 单行语句
- () -> {一段逻辑}
- () -> 表达式
代码示例
单行语句
// 定义一个接口
interface Message{
public void print();
}
public class TestDemo {
public static void main(String[] args) {
// 直接通过方法来调用
fun(() -> System.out.println("Hello!"));
}
public static void fun(Message msg) {
msg.print();
}
}
单行语句传递参数
// 定义一个接口
interface Message{
public void print(String str);
}
public class TestDemo {
public static void main(String[] args) {
// 直接通过方法来调用, str 为我们传递的参数
fun( (str) -> System.out.println(str));
}
public static void fun(Message msg) {
msg.print("使用 lambda 传递参数"); //使用 lambda 传递参数
}
}
多行语句
使用 {} 块,可以在里面写入多行逻辑
interface Message {
public abstract void print(String str);
}
public class Demo {
public static void main(String[] args) {
fun((s) -> {
s = s.toUpperCase();
System.out.println(s);
});
}
public static void fun(Message msg) {
msg.print("Hello World");
}
}
表达式
interface Message {
public abstract int add(int x, int y);
}
public class Demo {
public static void main(String[] args) {
// 如果是单行表达式,可以不用写 return,编译器会自己推断
fun((s1, s2) -> s1 + s2);
}
public static void fun(Message msg) {
System.out.println(msg.add(10, 90));
}
}
- 上一篇: java基础之java8新特性:Lambda表达式
- 下一篇: Java 21新特性-虚拟线程
猜你喜欢
- 2024-12-14 JAVA基础小知识(干货哟)
- 2024-12-14 Java 21新特性-虚拟线程
- 2024-12-14 java基础之java8新特性:Lambda表达式
- 2024-12-14 Java 9特性抢鲜看
- 2024-12-14 渣翻:从 Java 8 到 Java 18 的新语言特性
- 2024-12-14 Java面向对象的特性
- 2024-12-14 Java17 vs Java8: 新旧对决,这些Java 17新特性你不容错过
- 2024-12-14 Spring Boot 2.6新特性:使用Java 17的Record作为配置属性
- 2024-12-14 Java 18 新特性:简单Web服务器 jwebserver
- 2024-12-14 《我的世界》JAVA版特性开关!收纳袋、村民交易平衡、1.21更新!
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)