简单理解Lambda表达式

🍤Lambda表达式


一、基础引入

首先我们的Lambda表达式主要就是为了提高我们编写匿名接口重写其方法,为我们提供便捷,先看一下最普通的接口方法重写:【什么是Lambda?】(建议案例运行一下,容易理解)

/*基本写法重写接口内方法*/
public class Lambda1{
    public static void main(String[] args) {
        //重写接口内方法(匿名接口省去Inter1 inter1即可
        Inter1 inter1=new Inter1() {
            @Override
            public void run() {
                System.out.println("重写方法~~~");
            }
        };
        inter1.run();
    }
}

//编写接口类
interface Inter1{
    void run();
}

在这里插入图片描述


二、常规基础

最基础的写法过于冗余,于是下面使用Lambda写法进行简化(其中lambda有常用的四种函数式接口)下面案例都是基础写法方便理解

/*基本写法重写接口内方法*/
public class Lambda1{
    public static void main(String[] args) {
        //重写接口内方法
        Inter1 inter1=new Inter1() {
            @Override
            public void run() {
                System.out.println("重写方法~~~");
            }
        };
        inter1.run();


        //简化:通过接口的方法参数与返回值进行简化
        //1、首先重写方法体如果就一句则可以省略花括号,
        //2、其次如果就一个参数可以省略(),
        //3、无参数必须带()
        //4、方法体就一句且是返回值,return可以省略
        Inter1 inter2=()->{
            System.out.println("lambda简化------1");
        };

        Inter1 inter3=()->System.out.println("lambda简化------2");
        inter2.run();
        inter3.run();


        /*四种函数式接口的实现重写
        * */
        //函数型
        InterFun interFun=x-> x*10;//重写方法发
        System.out.println("函数型:"+interFun.fun(10));//调用

        //供给型
        InterGive interGive=()->100;
        System.out.println("供给型:"+interGive.give());

        //消费型
        InterMonery interMonery=x-> System.out.println("消费型:消费了~");
        interMonery.Monery(100);//随意传入一个参数

        //段言型
        InterBoolean interBoolean=x->x>10?true:false;
        System.out.println("段言型:"+interBoolean.isTrue(100));


    }

}

//编写接口类
interface Inter1{
    void run();
}

//函数型
interface InterFun{
    int fun(int x);
}

//供给型
interface InterGive{
    int give();
}

//消费型
interface InterMonery{
    void Monery(int x);
}

//段言型
interface InterBoolean{
    boolean isTrue(int x);
}

在这里插入图片描述


三、Lambda方法调用

方法的调用进行简化, 还是一样的类名/对象名.方法,不同的是调用的是重写接口的方法。

/*lambda方法*/
public class Lambda2 {
    public static void main(String[] args) {
        //创建类对象
        Lambda2 lambda2=new Lambda2();

        //调用接口方法
        // 非static修饰的方法需要对象::方法名调用
        // static修饰的直接类名::方法名
        Inter_1 inter1=lambda2::method_1;
        inter1.method(666);

        Inter_1 inter_2=Lambda2::method_2;
        inter_2.method(666);
    }

    //重写接口的方法对应
    public void method_1(int x){
        System.out.println("重写方法method_1");
    }

    //静态方法重写接口方法
    public static void method_2(int x){
        System.out.println("重写方法method_2(static版本)");
    }
}
interface Inter_1{
    void method(int x);
}

在这里插入图片描述


三、构造与实例

构造器Lambda表达式写法,与简化,下面会建一个Dog的类作为测试,以及通过lambda表达式来重写比较器进行集合的排序

/*构造器lambda表达式 */
public class Test02 {
    public static void main(String[] args) {
        //重写方法
        //写法1
        fun01 funA=()->{
            return new Dog();
        };
        System.out.println(funA.getDog());

        //写法优化
        fun01 funB=()->new Dog();
        System.out.println(funB.getDog());

        fun02 funD=(a,b)->new Dog();
        funD.getDog("kk",33);
        //写法2(Dog::new最简)
        fun02 funC=Dog::new;
        System.out.println(funC.getDog("小花",10));
    }
}

/*接口一获取一个Dog对象*/
interface fun01{
    Dog getDog();
}

/*接口二获取一个有参构造对象*/
interface fun02{
    Dog getDog(String name,Integer age);
}

在这里插入图片描述


假设一个集合进行集合内数据进行排序

/*
* 对集合排序
* */
public class Demo01 {

    public static void main(String[] args) {

        List<Dog> dogs=new ArrayList<>();
        dogs.add(new Dog("a",20));
        dogs.add(new Dog("b",24));
        dogs.add(new Dog("c",18));
        dogs.add(new Dog("d",23));

        //排序lambda
        //此处使用了Comparator<? super E> c函数式接口比较器中的方法int compare(T o1, T o2);
        //通过此方法一个返回值两个参数可以直接进行lambda表达式写法
        dogs.sort((dog1,dog2)->dog1.age-dog2.age);
        //lambda打印
        dogs.forEach(System.out::println);
    }
}

在这里插入图片描述


System.out::println

这个一般出现在forEach()方法中作为参数,printlnPrintStream.java类中的一个方法,outSystem.java类的一个PringtStream类型的常量对象,故System.out.println是正常的调用写法,但此处println方法作为forEach(Consumer<? super T> action)的参数,也就是Consumer<? super T> action函数式接口的重写方法,也就是其接口内的void accept(T t);方法对应,故写成:集合:forEach(System.out::println);


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每日小新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值