栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【jdk8新特性】Lambda表达式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【jdk8新特性】Lambda表达式

【jdk8新特性】Lambda表达式 00.前言

如果有任何问题请指出,感谢。

01.为什么要用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表达式 代码简单

02.lambda表达式格式与约束 格式:

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

约束:

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

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

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

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

03.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 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  void sort(List list, Comparator c) {
    list.sort(c);
}

Comparator接口部分代码

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

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

forEach源码

public void forEach(Consumer 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 {
    void accept(T t);
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/940082.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号