java Lambda表达式的使用心得

作者:知我饭否 时间:2023-08-18 05:59:51 

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();

输出结果

java Lambda表达式的使用心得

很简洁有没有?省略了好多代码是不是,在这里 你可以发现”,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方法都必须要实现方法体如下图

java Lambda表达式的使用心得

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+");

输出结果如下

java Lambda表达式的使用心得

当然你还会问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"));

运行的结果:

java Lambda表达式的使用心得

总结 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);
   }
}

来源:https://blog.csdn.net/a1064072510/article/details/80947286

标签:java,Lambda,表达式
0
投稿

猜你喜欢

  • android Watchdog 实现剖析

    2022-07-12 06:39:21
  • Android下载进度监听和通知的处理详解

    2022-03-27 08:39:02
  • Java解析XML格式数据的方法详解

    2022-03-25 09:28:25
  • Java中常见的陷阱题及答案

    2021-08-10 16:32:11
  • 90分钟实现一门编程语言(极简解释器教程)

    2022-01-15 05:11:56
  • JAVA编程不能不知道的反射用法总结

    2023-08-25 18:41:06
  • springboot 正确的在异步线程中使用request的示例代码

    2023-11-24 22:36:13
  • Android实现将应用崩溃信息发送给开发者并重启应用的方法

    2021-07-25 02:42:14
  • Android View移动的3种方式总结

    2022-04-29 02:04:47
  • Android实现关机重启的方法分享

    2022-11-13 21:32:33
  • Android开发之TabActivity用法实例详解

    2022-08-09 00:09:03
  • c#创建圆形类Circle、矩形类实现代码

    2023-08-18 19:59:12
  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    2021-08-21 21:16:40
  • SpringMVC五种类型参数传递及json传递参数

    2022-07-26 15:08:24
  • Android开源项目PullToRefresh下拉刷新功能详解

    2022-02-02 15:14:54
  • 详解Spark Sql在UDF中如何引用外部数据

    2021-08-17 14:51:17
  • Spring Security前后分离校验token的实现方法

    2023-06-26 17:00:30
  • C#泛型集合类System.Collections.Generic

    2023-02-24 19:21:18
  • c#中list.FindAll与for循环的性能对比总结

    2021-08-15 21:20:44
  • c# 代理模式

    2022-02-19 09:48:31
  • asp之家 软件编程 m.aspxhome.com