JAVA lambda表达式奇淫技巧

lamda表达式

传统代码空间的设置操作

package org.example.lambda;

public class theFirstLambda {
    public static void main(String[] args) {
        //这是基本的实现匿名内部类操作的理解
        //匿名内部类一般都是用来实现接口所定义的方法操作的
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程执行操作了");
            }
        });
        thread.start();
    }
}

在这里插入图片描述

利用lambda操作实现匿名表达式操作

package org.example.lambda;

public class theFirstLambda {
    public static void main(String[] args) {
        //这是基本的实现匿名内部类操作的理解
        //匿名内部类一般都是用来实现接口所定义的方法操作的
        Thread thread=new Thread(()->{
            System.out.println("这是匿名表达式操作理解");
        });
        thread.start();
    }
}

在这里插入图片描述

在这里插入图片描述

  • 底层中,java虚拟机并不会对lambda表达式的对象生成对应的匿名内部类的表达文件,总体对空间来说其实也没有节省多少,其实是将匿名内部类内嵌到主类之中了

  • 利用javap -v完全可以查看相关的字节码文件操作

    • 通过对lambda的底层字节码的深入理解你完全可以看到,虚拟机在执行的时候是会对其中的匿名内部类进行一定的操作的,这就完全不是一种模糊化的理解了,我好像发现了新大陆,这个大陆能否让我成为大神,应该会是一把钥匙,真正的深入这个虚拟机底层了!!!

    Java以及IDEA下查看字节码的五种方法_怎么看文件字节码-CSDN博客

    主类的字节码文件

在这里插入图片描述

匿名内部类的字节码文件

在这里插入图片描述

  • 很明显的看见,两个类是相互调用的关系,但是使用了lambda的语法糖操作,看看底层会有什么变化吧

两个方法形成了内嵌操作,并且其中自动生成了一个对应的匿名表达式的类,这个类就是匿名表达式的底层构造方法

在这里插入图片描述
在这里插入图片描述

  • 关于24的堆栈信息操作理解,很明显出现了一个自动生成的方法,也就是对应的总体的字节码信息理解!
Exception in thread "Thread-0" java.lang.RuntimeException: 这里是线程异常操作
	at org.example.lambda.theFirstLambda.lambda$main$0(theFirstLambda.java:8)
	at java.base/java.lang.Thread.run(Thread.java:834)

  • 利用抛出异常的形式也能发现,使用Lambda操作实现了一个自动类的操作理解

好了,说了这么多,我就来讲讲lambda表达式的常用的情形吧,Lambda一般用于实现接口的抽象方法,利用lambda可以不去实现接口的实现类,减少代码量,但是总的来说,这是java的一种语法糖,我觉得这种写法在平时的操作之中还是蛮装逼的,但是lambda用于实现接口的方法确实是非常的优质,减少了底层代码的空间利用率,确实是比较好的,看读者喜欢那种吧

实现一个自定义类的lambda表达式的demo

package org.example.lambda.testInterface;

@FunctionalInterface
public interface theTestInterface {
    String backString(Integer index);
}

  • 如果一个接口需要实现lambda表达式,那么这个接口必须使用@FunctionalInterface注解,这样才能使用lambda语法,不然总体程序还是会出现一定的错误
theTestInterface theTestInterface=(Integer i)-> "this is why we play:"+i;
        //这样的实现就显然比较强大了,直接使用引用操作来进行传输对象的参数
        System.out.println(theTestInterface.backString(3));

利用匿名表达式来对接口的方法进行实现,确实减少了很大的代码量,并且我觉得底层空间也是减少了的

lambda与cpp方法引用

这里使用lambda表达式操作,为代码书写者提供了一些cpp的性能特性,我其实对cpp并不熟悉,但是这里所体现的思想也是一致的,利用一个类中的方法引用来实现接口的抽象方法,这种对应连接关系是非常优质的吗,也是这个小技巧所教会我的东西,可以理解为指针进行连接的操作!

		theTestInterface theTestInterface2=thelambda::backString;
        //传递方法的引用相当于进行了实现操作,这里操作接口的方法是非常强大的
        System.out.println(theTestInterface2.backString(3));
        //利用相关的操作实现的其他操作
        thelambda thelambda=new thelambda();
        //方法引用好像指针理解操作
        theTestInterface theTestInterface3=thelambda::backNoStaticString;
        System.out.println(theTestInterface3.backString(9));
    }
    public static String backString(Integer i){
        return "this is the string:"+i;
    }
    public String backNoStaticString(Integer i){
        return "why we want to be:"+i;
    }
  • 如果是静态方法,可以直接利用主类进行引用
  • 如果是非静态的方法,那么需要进行对象的创建,然后进行引用

读者肯定对这里非常熟悉了,这其实就是一种指针的思想,当然了在java中肯定比在c中更加安全!

只要实现了上述注解的类或者接口

都能使用lambda表达式进行操作,并且都能使用方法引用操作

package org.example.lambda.theArrayLambda;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Comparator;

public class theArrayLambda {

    //方法引用传递操作,本质还是指针操作理解!
    public static void main(String[] args) {
        Integer[] integer=new Integer[] {8,234,32,25,6,523,1,2,2345};
        //注意参数之间的操作实现
		Arrays.sort(integer,Integer::compare)
        //可以利用返回值操作来进行对比操作,但是这种方式是否真的比较灵活呢?
        //降序排列实现操作
        Arrays.sort( integer,theArrayLambda::smallCompare);
        System.out.println(Arrays.toString(integer));
    }
    //仅仅只是升序操作,这不也是默认的操作理解吗
    public static int smallCompare(int x,int y){
        return (x>y) ? -1:((x==y)?0:1);
    }
}

  • 可以利用返回值进行方法引用
  • 也可以利用相关的自定义对象进行引用

还有就是一定要习惯三元表达式,这个表达式也是一个降低代码量,并且可以提升抽象能力的代码技巧!

我是一名热爱生活的程序员,欢迎关注我的博客!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值