Java多线程-lambda表达式

113 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

lambda表达式

lambda 表达式可以简化我们的代码本质属于函数式编程

为什么要用lambda表达式

1 避免匿名内部类定义过多

2 key让代码看起来更加整洁

3 去掉一推没有意义的代码,只留下核心的逻辑

什么是lambda 表达式

它是Java8函数式接口(function interface),Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

函数式接口的定义

1 任何接口,如果只包含唯一一个抽象方法,那么它就是函数式接口

我们的runnable接口就是一个lambda表达式

//比如Runnable接口中的run方法   一个接口只有唯一一个抽象方法,就是函数式接口,就可以用lamda表达式创建该接口的对象

public interface Runnable{

    public abstract void run();

}

2 对于函数式接口,我们可以使用lambda表达式来创建该接口的对象

package com.wyh.lamda;



 /**

 *  @program:  Thread

 *  @description:  lambda表达式测试

 *  @author:  魏一鹤

 *  @createDate:  2021-12-30 22:39

 **/



 //3 静态内部类



 //推导lambda表达式

public class TestLambda1 {

  static  class Like2 implements ILike {



        @Override

        public void lambda() {

            System.out.println( "I Like Lambda2" );

        }

    }



    public static void main(String[] args){

            //用接口去创建对象  接口去new它的实现类

 ILike like=new Like();

            like.lambda();



            like= new Like2();

            like.lambda();



            //4 局部内部类

  class Like3 implements ILike {



            @Override

            public void lambda() {

                System.out.println( "I Like Lambda3" );

            }

        }

        like=new Like3();

        like.lambda();



        //5 匿名内部类,没有类的名称,必须借助接口或者父类

 like=new ILike() {

            @Override

            public void lambda() {

                System.out.println( "I Like Lambda4" );

            }

        };

        like.lambda();

        //6 用lambda简化

 like=()-> {

            System.out.println( "I Like Lambda5" );

        };

       like.lambda();

    }

}

 //1 定义一个函数式接口

interface ILike{

 abstract  void lambda();

}

 //2 实现类  去实现接口

class Like implements ILike {

    @Override

    public void lambda() {

        System.out.println( "I Like Lambda" );

    }

} 

下面是一个带参数的lambda表达式的例子



package com.wyh.lamda;



 /**

 *  @program:  Thread

 *  @description:  Lambda表达式

 *  @author:  魏一鹤

 *  @createDate:  2021-12-30 23:00

 **/



public class TestLambda2 {

    //静态内部类



  public static void main(String[] args){



        //1 lambda表达式简化

 ILove love =(int num)-> {

            System.out.println( "I Love You -->" +num);

        };



        //简化1 去掉参数类型

 love=(num)-> {

            System.out.println( "I Love You -->" +num);

        };

        // 简化2  去掉括号

 love=num-> {

            System.out.println( "I Love You -->" +num);

        };

        //简化3 去掉花括号

 love=num->System.out.println( "I Love You -->" +num);



        //总结

 //lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块({}花括号)包裹

 //前提是函数式接口 接口只有一个方法

 //多个参数也可以去掉数据类型,要去掉都去掉,要留下都留下,必须加括号把参数括起来(a,b)

 love.ILove(520);







    }

}

 //定义一个函数式接口 带参数

interface ILove{

    void ILove(int num);

}

 //定义类实现接口

class Love implements ILove {



    @Override

    public void ILove(int num) {

        System.out.println( "I Love You -->" +num);

    }



}

简化方式

简化1 去掉参数类型


love=(num)-> {

    System.out.println( "I Love You -->" +num);

};
简化2 去掉括号
love=num-> {

    System.out.println( "I Love You -->" +num);

};
简化3 去掉花括号
love=num->System.out.println( "I Love You -->" +num);

代码总结

1 lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块({}花括号)包裹
2 前提是函数式接口 接口只有一个方法
3 多个参数也可以去掉数据类型,要去掉都去掉,要留下都留下,必须加括号把参数括起来(a,b)

最终简化代码



package com.wyh.lamda;



 /**

 *  @program:  Thread

 *  @description:  Lambda表达式

 *  @author:  魏一鹤

 *  @createDate:  2021-12-30 23:00

 **/



public class TestLambda2 {

    //静态内部类



  public static void main(String[] args){



        ILove love;

        // 简化2  去掉括号

 love=(num,num2,num3)-> {

            System.out.println( "I Love You -->" +num);

        };





        //总结

 //lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,那么就用代码块({}花括号)包裹

 //前提是函数式接口 接口只有一个方法

 //多个参数也可以去掉数据类型,要去掉都去掉,要留下都留下,必须加括号把参数括起来(a,b)

 love.ILove(520,123,232);







    }

}

 //定义一个函数式接口 带参数

interface ILove{

    void ILove(int num,int num2,int num3);

}

 //定义类实现接口

class Love implements ILove {



    @Override

    public void ILove(int num1,int num2,int num3) {

        System.out.println( "I Love You -->" +num1);

    }



}