Java高级重点知识点-19-Lambda

文章目录

Lambda表达式

函数式编程思想

强调做什么,而不是以什么形式做。

以函数式接口Runnable为例讲解:

java 复制代码
public class LambdaDemo {

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello World");
            }
        };

        new Thread(runnable).start();
    }
}
  • Thread 类需要 Runnable 接口作为参数,其中的抽象 run 方法是用来指定线程任务内容的核心;
  • 为了指定 run 的方法体,不得不需要 Runnable 接口的实现类;
  • 为了省去定义一个 RunnableImpl 实现类的麻烦,不得不使用匿名内部类;
  • 必须覆盖重写抽象 run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
  • 而实际上,似乎只有方法体才是关键所在。

Lambda表达式写法

标准格式:

txt 复制代码
(参数类型 参数名称) ‐> { 代码语句 }
  • 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
  • -> 是新引入的语法格式,代表指向动作。
  • 大括号内的语法与传统方法体要求基本一致。
java 复制代码
public class LambdaDemo {
    public static void main(String[] args) {
        Runnable runnable = () -> System.out.println("Hello World");
        new Thread(runnable).start();
    }
}
  • 前面的一对小括号即 run 方法的参数(无),代表不需要任何条件;
  • 中间的一个箭头代表将前面的参数传递给后面的代码;
  • 后面的输出语句即业务逻辑代码。

这里可以看到我们使用lambda表达式的写法,使我们的代码更加简单,注重了结果的显示,避免了冗余代码。

代码讲解

  • 无参无返回值

Plane.java

java 复制代码
@FunctionalInterface
public interface Plane {
    void fly();
}

Customer.java

java 复制代码
public class Customer {

    public static void invokePlane(Plane plane){
        plane.fly();
    }

    public static void main(String[] args) {
        Customer.invokePlane(() -> System.out.println("飞机起飞咯!"));
    }
}
  • 有参无返回值
    Plane.java
java 复制代码
@FunctionalInterface
public interface Plane {
    void fly(String name);
}

Customer.java

java 复制代码
public class Customer {

    public static void invokePlane(String name , Plane plane){
        plane.fly(name);
    }

    public static void main(String[] args) {
        Customer.invokePlane("飞机一号",name -> System.out.println(name + ",起飞咯!"));
    }
}
  • 无参有返回值
    Plane.java
java 复制代码
@FunctionalInterface
public interface Plane {
    String fly();
}

Customer.java

java 复制代码
public class Customer {

    public static void invokePlane(Plane plane){
        System.out.println(plane.fly());
    }

    public static void main(String[] args) {
        Customer.invokePlane(() ->  "飞机起飞咯!");
    }
}
  • 有参有返回值

Plane.java

java 复制代码
@FunctionalInterface
public interface Plane {
    String fly(Date date,String name);
}

Customer.java

java 复制代码
import java.util.Date;

public class Customer {
    public static void invokePlane(Date date, String name, Plane plane) {
        System.out.println(plane.fly(date, name));
    }
    public static void main(String[] args) {
        Customer.invokePlane(new Date(),"飞机一号",(date, name) -> name + "在" + date.toLocaleString() + "时起飞咯!");
    }
}

小tips:
可推导即可省略

  • 小括号内参数的类型可以省略;
  • 如果小括号内有且仅有一个参,则小括号可以省略;
  • 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

以上代码中的lambda表达式全是最简写法,感兴趣的友友可以尝试该成完整版本。

这里以最后一个例子为例讲解一下完整版本。

java 复制代码
import java.util.Date;

public class Customer {
    public static void invokePlane(Date date, String name, Plane plane) {
        System.out.println(plane.fly(date, name));
    }
    public static void main(String[] args) {
        Customer.invokePlane(new Date(),"飞机一号",(date, name) -> { return name + "在" + date.toLocaleString() + "时起飞咯!";});
    }
}

欢迎java热爱者了解文章,作者将会持续更新中,期待各位友友的关注和收藏。。。

相关推荐
望获linux3 分钟前
【Linux基础知识系列】第六十四篇 - 了解Linux的硬件架构
linux·运维·服务器·开发语言·数据库·操作系统·嵌入式软件
我会冲击波7 分钟前
告别手写注释!变量命名、注释IDEA插件更新了,AI帮你搞定一切代码注释
java·intellij idea
BUG创建者19 分钟前
openlayer根据不同的状态显示不同的图层颜色
android·java·javascript
羊锦磊40 分钟前
[java 常用类API] 新手小白的编程字典
java
都叫我大帅哥42 分钟前
TOGAF技术架构阶段全解析:从理论到Java实战,避坑指南附赠!
java
星辰大海的精灵1 小时前
深入解析 CopyOnWriteArrayList
java·后端·算法
都叫我大帅哥1 小时前
Java ScopedValue:线程安全的"数据气泡"指南
java
Code季风1 小时前
深入 Spring IoC 容器:六大关键应用场景助力项目开发
java·spring
这些不会的1 小时前
iphone手机使用charles代理,chls.pro/ssl 后回车 提示浏览器打不开该网页
java
带刺的坐椅1 小时前
Solon 集成 LiteFlow:轻量级工作流引擎的极简实践指南
java·solon·liteflow·rule