java Lambda表达式的使用心得

 更新时间:2021年10月11日 15:33:18   作者:知我饭否  
这篇文章主要介绍了java Lambda表达式的使用心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Lambda表达式的心得

如题,因为博主也是最近才接触到Lambda表达式的(PS 在这里汗颜一会)。我并不会讲解它的原理,诚然任何一件事物如果理解原理的话,使用它必将更加容易。但博主在学习的时候,大多数时候都是学会怎么用,然后在细究原理。就像你骑自行车之前,难道首先还要研究自行车的原理么?

首先Lambda表达式的最简单应用如下

Lambda表达式法

        String lam= "初次相识Lambda";
        new Thread(() -> System.out.println(lam)).start();

传统方法

  String tradition="传统方法";
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(tradition);
            }
        }).start();

输出结果

很简洁有没有?省略了好多代码是不是,在这里 你可以发现”,Lambda表达式和在Thread创建一个匿名类的作用是一样。我们可以这样认为Lambda表达式本身代表了一个匿名类。

这就是Lambda最大的作用,当然Lambda表达式只能创建接口interface对象。 创建类是不行的,抽象类也是不行的 ,只要是类都是不行的。

首先,我定义了一个自定义的接口,可以用来测试

@FunctionalInterface
public interface Lam {
    //Lambda表达式调用的方法
    void bda();
    
    //接口的默认方法
    default void test(){
        System.out.println("我是默认的方法");
    };
    //接口的静态方法
    static void test1(){
        System.out.println("我是静态方法");
    }
}

使用Lambda表达式 你首先要知道的

1.Lambda表达式只能是接口 interface的创建(PS从上面的例子可以看出来,Runnable是接口,可以查看源代码),并且这个接口只能包含一个方法(除了default方法和static方法)。在接口中创建default方法和static方法都必须要实现方法体如下图

2.如果你用Lambda表达式来创建类 class,则会出现以下错误 ”Target type of a lambda conversion must be an interface“如果你怕自己的定义的接口不符合Lambda表达式的规范 ,你可以在接口interfaca 上面添加注解@FunctionalInterface

3.Lambda表达式的规范表示格式 (parameters) ->{ statements; }。在某些时刻,你还可以简化这个格式

  //接口定义的方法无参数时候,并且你想要执行操作也只有一句代码的时候,Lambda会自动返回一句代码,并且可以不用加{}
        Lam lam1=()->System.out.println("无参数");

你可以发现后面的大括号{ }没了,这是因为后面代码如果只有一句的话,是可以省略{ } 的

我们把Lam接口定义的调用方法参数修改一下,多出了一个String类型的形参s

 //Lambda表达式调用的方法
    void bda(String s);

这时候 我们如果使用Lambda表达式,则可以这样

//接口定义的方法有参数时候,并且你想要执行的操作也只有一句代码的时候
        Lam lam1=e->System.out.println(e);//这一句还有简化版本  Lam lam1=System.out::println;
        lam1.bda("4556");

你又会发现,前面的()中括号也没了,这是因为当参数只有一个的时候,是可以省略()的。

当然也有你要执行很多代码的时候,那这时候可以这样

 //接口定义的方法有参数时候,并且你想要执行的操作有很多句代码的时候
        Lam lam1 = (String e) -> {
            String a = e + "add";
            System.out.println(a);
        };
        lam1.bda("test+");

输出结果如下

当然你还会问Lambda表达式能不能返回东西呢?这是肯定能的,首先我们再把上面的Lam接口方法修改一下

 //Lambda表达式调用的方法
    String bda(String s);

让bda方法返回一个String值,这次如果我们用Lambda的话

//接口定义的方法有返回值的时候
        Lam lam1=s ->{System.out.println(s);return "我是返回的数据";};
        lam1.bda("test1");
        System.out.println(lam1.bda("test2"));

运行的结果:

总结 Lambda表达式 就是用来创建一个匿名的接口对象,即 它本身就是一个接口的匿名实例。只不过这个接口 有一些条件限制。

Lambda表达式的技巧

Lambda表达式只能用来简化仅包含一个public方法的接口的创建

规则

  • 1.只能是接口
    • 否则报:Target type of a lambda conversion must be an interface
  • 2.只能有一个public方法
    • 否则报:Multiple non-overriding abstract methods found AInterface
    • 或AInterface is not a functional interface

括号形式

testA((int i, int j) -> {});参数要与接口一致

public class Go {
    public static void main(String a[]) {
        //正确示范
        testA((int i, int j) -> {});
        //错误示范:Multiple non-overriding abstract methods found xxx;只能有一个public方法
        testB((int i, int j) -> {});
        //错误示范:Target type of a lambda conversion must be an interface;只能是接口
        testC((int i, int j) -> {});
    }
    public static void testA(AInterface t) {    }
    public static void testC(CInterface t) {}
    public static void testB(BInterface t) {}
    interface AInterface {
        void xxx(int i, int j);
    }
    interface BInterface {
        void xxx(int i, int j);
        void YYY(int i, int j);
    }
    abstract class CInterface {
        abstract void xxx(int i, int j);
    }
}

双冒号表达形式

  • 双冒号后面必须是静态方法
    • 否则报错:Non-static method cannot be referenced from a static context
  • 双冒号后面的方法与接口方法参数一样
  • 方法与接口的权限可以不一样
  • 返回类型:如果接口里面方法是void,双冒号后的方法可以任意返回类型,否则要一致
public class Go {
    public static void main(String a[]) {
        //之前的写法
        testA(new AInterface() {
            @Override
            public void xxx(int i, int j) {
                
            }
        });
        //正确,相对与接口里面xxx方这是改成静态和换了个名字
        testA(Go::mydog);
        //正确,加了返回类型和public换成private,也是ok
        testA(Go::mydog2);
        
        //错误:Non-static method cannot be referenced from a static context
        testA(Go::mydog3);
        //这样写也是ok的。
        AInterface aInterface = Go::mydog;
        testA(aInterface);
    }
    public static void testA(AInterface t) {
        t.xxx(1, 2);
    }
    interface AInterface {
        void xxx(int i, int j);
    }
    public static boolean mydog(int i, int j) {
        System.out.println("mydog" + i + " & " + j);
        return false;
    }
    private static void mydog2(int i, int j) {
        System.out.println("mydo2" + i + " & " + j);
    }
    public void mydog3(int i, int j) {
        System.out.println("mydog3" + i + " & " + j);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Spring CROS解决项目中的跨域问题详解

    使用Spring CROS解决项目中的跨域问题详解

    这篇文章主要介绍了使用Spring CROS解决项目中的跨域问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java synchronized实现可见性过程解析

    java synchronized实现可见性过程解析

    这篇文章主要介绍了java synchronized实现可见性过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • springboot默认日志框架选择源码解析(推荐)

    springboot默认日志框架选择源码解析(推荐)

    这篇文章主要介绍了springboot默认日志框架选择源码解析(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Socket结合线程池使用实现客户端和服务端通信demo

    Socket结合线程池使用实现客户端和服务端通信demo

    这篇文章主要为大家介绍了Socket结合线程池的使用来实现客户端和服务端通信实战demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • java单例模式实现的方法

    java单例模式实现的方法

    这篇文章主要介绍了如何在JAVA中实现单例模式,文中代码简单易懂,供大家参考学习,感兴趣的小伙伴可以了解下
    2020-06-06
  • Java中String类常用类型实例总结

    Java中String类常用类型实例总结

    在我们开发中经常会用到很多的常用的工具类,这里做一个总结,下面这篇文章主要给大家介绍了关于Java中String类常用类型的相关资料,String类代表字符串,需要的朋友可以参考下
    2021-12-12
  • 详解设计模式中的proxy代理模式及在Java程序中的实现

    详解设计模式中的proxy代理模式及在Java程序中的实现

    代理模式主要分为静态代理和动态代理,使客户端方面的使用者通过设置的代理来操作对象,下面来详解设计模式中的proxy代理模式及在Java程序中的实现
    2016-05-05
  • Java中的Phaser使用详解

    Java中的Phaser使用详解

    这篇文章主要介绍了Java中的Phaser使用详解,与其他障碍不同,注册在phaser上进行同步的parties数量可能会随时间变化,任务可以随时进行注册,需要的朋友可以参考下
    2023-11-11
  • 基于Java实现简单的邮件群发功能

    基于Java实现简单的邮件群发功能

    这篇文章主要为大家详细介绍了如何利用Java语言编写一个简单的工具类,可以实现邮件群发功能。文中的示例代码讲解详细,需要的可以参考一下
    2022-05-05
  • Spring Boot详解配置文件有哪些作用与细则

    Spring Boot详解配置文件有哪些作用与细则

    SpringBoot项目是一个标准的Maven项目,它的配置文件需要放在src/main/resources/下,其文件名必须为application,其存在两种文件形式,分别是properties和yaml(或者yml)文件
    2022-07-07

最新评论