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

Lambda表达式

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

Lambda表达式

Lambda 1.函数式编程思想

java是面向对象;

面向对象编程思想:做一件事情找一个能解决事情的对象,调用对象的方法,完成事情

函数式编程思想:他做一件事情,只要能获取结果,谁去做的,怎么做到都不重要,只重视结果,不重视过程

固然面向对象的方式,更容易让人理解,但是有时候代码过于冗余

class RunnableImpl implements Runnable{

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + "不错,是你");
    }
}
public class Demo01 {
    public static void main(String[] args) {
        //创建接口实现对象
        RunnableImpl run = new RunnableImpl();
        //创建Thread类对象
        Thread thread = new Thread(run);
        //调用start方法
        thread.start();
    }
}

我们还可以用匿名内部类

public class Demo01 {
    public static void main(String[] args) {

        //简化代码,使用匿名内部类
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "不错,是我");
            }
        }).start(); 
    }
}

其实核心的代码就是

System.out.println(Thread.currentThread().getName() + "不错,是我");

过于冗余

我们来看看Lambda表达式

public class Demo02Lambda {
    public static void main(String[] args) {
        //使用Lambda表达式表示多线程

        new Thread(()-> {
            System.out.println(Thread.currentThread().getName() + "不错,是我");
        }).start();
    }
}
Lambda的格式

​ Lambda表达式的标准格式:

​ 由三部分组成:

​ a.一些参数

​ b.一个箭头

​ c.一段代码

​ 格式:

​ (参数列表) -> {一些重写方法的代码};

​ 解释说明格式:

​ ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用逗号分隔

​ ->:传递的意思,把参数传递给方法体{}

​ {}:重写接口的抽象方法的方法体

Lambda的练习

无参无返回

package Demo06Lambda;
interface Cook{
    //无参数无返回值方法
    abstract void makeFood();
}
public class Demo03 {
    public static void main(String[] args) {
        //调用invokeCook方法,参数是接口
        invokeCook(new Cook() {
            @Override
            public void makeFood() {
                System.out.println("吃饭啦");
            }
        });
        //使用lambda表达式,简化匿名内部类的书写
        invokeCook(()->{
            System.out.println("喝水啦");
        });
    }
    //定义一个方法传递cook接口,方法内部调用接口方法makefood
    public static void invokeCook(Cook c) {
        c.makeFood();
    }
}

有参数有返回

package Demo06Lambda;

interface Calculator{
    //定义一个计算两个int整数和的方法并返回结果
    public abstract int calc(int a,int b);
}

public class Demo05 {
    public static void main(String[] args) {
        //使用匿名内部类
        invokeCalc(10, 20, new Calculator() {
            @Override
            public int calc(int a, int b) {
                return a+b;
            }
        });
        //使用lambda表达式
        invokeCalc(10,20,((a, b) -> {return a-b;}));
    }
    //定义一个方法,参数传递Calculator方法内部调用calc计算两个整数和
    public static void invokeCalc(int a,int b,Calculator c){
        int sum = c.calc(a,b);
        System.out.println(sum);
    }
}
产生的疑问(如何确定Lambda锁传递的参数是给那个接口的)
        Arrays.sort(arr, (Person o1,Person o2)-> {
            return o2.getAge() - o1.getAge();
        });

在这个代码中点击查看sort源代码

public static  void sort(T[] a, Comparator c) {
    if (c == null) {
        sort(a);
    } else {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, 0, a.length, c, null, 0, 0);
    }
}

原来他必须传递一个Comparator类

最后小总结有且仅有一个抽象方法的接口称为函数式接口

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

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

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