【jdk8新特性】Lambda表达式

简介: 【jdk8新特性】Lambda表达式

【jdk8新特性】Lambda表达式

为什么要用lambda表达式

先看这个例子

public static void main(String[] args) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("内部类多线程写法");
        }
    }).start();

    new Thread(()->{
        System.out.println("lambda多线程写法");
    }).start();
}

结果

内部类多线程写法
lambda多线程写法

我们可以看出 用传统的内部类写法 代码冗余,而用lambda表达式 代码简单

lambda表达式格式与约束

格式:

(参数1,参数2....)->代码实现

约束:

首先lambda表达式只能用于参数为 接口且接口中只有一个抽象方法需要实现 与 变量为接口且接口中只有一个抽象方法需要实现。

我们 来看一下Thread需要的参数 Runnable接口的源码

public interface Runnable {
    public abstract void run();
}

可以看出 Runnable接口 只有一个抽象方法,所以满足lambda的约束,所以可以用lambda表达式表示。

lambda表达式的几个例子

01:参数用lambda表达式书写

// 参数用lambda表达式书写
@Test
public void Test1(){
    running(()->{
        System.out.println("正在跑步");
    });
}
public void running(Running running){
    running.run();
}

Running接口

public interface Running {
    void run();
}

可以看出Running接口 只有一个抽象方法,所以可以用lambda表达式

结果

正在跑步

02:变量为接口对象 对象的抽象方法实现用lambda

// 变量为接口对象 对象的抽象方法实现用lambda
@Test
public void Test2(){
    person p = ()->{
        System.out.println("吃");
    };
    p.eat();
}

person接口

interface person{
    void eat();
}

结果

03:对排序接口的实现 以及 forEach方法中lambda表达式的应用

// 对排序接口的实现 以及 forEach方法中lambda表达式的应用
@Test
public void Test3(){
    ArrayList<Person> persons = new ArrayList<>();
    persons.add(new Person("刘德华", 53, 174));
    persons.add(new Person("张学友", 55, 176));
    persons.add(new Person("刘德华", 56, 171));
    persons.add(new Person("黎明", 54, 178));

    Collections.sort(persons, (Person o1, Person o2) -> {
        return o2.getAge() - o1.getAge(); // 降序
    });

    persons.forEach((t) -> {
        System.out.println(t);
    });
}

sort方法源码

public static <T> void sort(List<T> list, Comparator<? super T> c) {
    list.sort(c);
}

Comparator接口部分代码

public interface Comparator<T> {
    int compare(T o1, T o2);
}

可以看出sort方法中的参数二为 符合条件的接口 所以可以使用lambda表达式

forEach源码

public void forEach(Consumer<? super E> action) {
    Objects.requireNonNull(action);
    final int expectedModCount = modCount;
    final Object[] es = elementData;
    final int size = this.size;
    for (int i = 0; modCount == expectedModCount && i < size; i++)
        action.accept(elementAt(es, i));
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

Consumer接口源码

public interface Consumer<T> {
    void accept(T t);
}

可以看出forEach的参数 也满足lambda的要求 所以可以使用lambda表达式,其中Consumer是我们后续需要学习的接口之一。

目录
相关文章
|
22天前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
20 1
|
2月前
|
容器
jdk8新特性-详情查看文档
jdk8新特性-详情查看文档
42 3
|
27天前
|
存储 安全 Java
JDK1.8 新的特性
JDK1.8 新的特性
18 0
|
2月前
|
编解码 安全 Java
jdk8新特性-接口和日期处理
jdk8新特性-接口和日期处理
|
2月前
|
Java 编译器 API
JDK8新特性--lambda表达式
JDK8的Lambda表达式是Java语言的一大进步。它为Java程序提供了更多的编程方式,让代码更加简洁,也让函数式编程的概念在Java中得到了体现。Lambda表达式与Java 8的其他新特性,如Stream API、新的日期时间API一起,极大地提高了Java编程的效率和乐趣。随着时间的流逝,Java开发者对这些特性的理解和应用将会越来越深入,进一步推动Java语言和应用程序的发展。
13 0
|
2月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
257 3
|
3月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
55 1
|
3月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
661 4
|
4月前
|
Java Linux
Linux复制安装 jdk 环境
Linux复制安装 jdk 环境
103 3
|
1月前
|
Oracle Java 关系型数据库
jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?
本文提供了详细的JDK 17安装教程,包括下载、安装、配置环境变量的步骤,并解释了在已有其他版本JDK的情况下如何管理多个JDK环境。
240 0