0


Lambda表达式详解

Lambda表达式

1. 为什么使用lambda表达式

lambda是一个匿名函数,我们可以吧lambda表达式理解为是一段可以传递的代码。使用它可以写出更简洁,更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

2. 入门案例

先看一个简单的Java线程中的Runnable接口案例

publicvoidtest01(){Runnable ri =newRunnable(){@Overridepublicvoidrun(){System.out.println("好好学习,天天向上");}};
        ri.run();}

在这里插入图片描述

再看下使用了Lambda表达式的版本

publicvoidtest02(){Runnable r2 =()->System.out.println("学会lambda,快乐每一天");
        r2.run();}

在这里插入图片描述

相信看到这里,对Lambda表达式的第一印象就是代码怎么这么短,这也就是lambda表达式的特性:简洁。

再看一个案例,比较数的大小

publicvoidtest03(){Comparator<Integer> comparator =newComparator<Integer>(){@Overridepublicintcompare(Integer o1,Integer o2){returnInteger.compare(o1,o2);}};int compare = comparator.compare(12,21);System.out.println(compare);}

在这里插入图片描述

因为12是小于21的,所以这里返回的是-1;我们再来看看对应的lambda表达式的写法

publicvoidtest04(){Comparator<Integer> comparator =(o1,o2)->Integer.compare(o1,o2);int compare = comparator.compare(32,23);System.out.println(compare);}

在这里插入图片描述

因为32大于23,所以返回值为1;

3. lambda表达式组成

形如以下:

(o1,o2) -> Integer.compare(o1,o2)

左边
->
右边
  • -> 被称为lambda操作符或箭头操作符
  • 左边:lambda形参列表(其实就是接口中的抽象方法的形参列表)
  • 右边:lambda体 (其实就是重写的抽象方法的方法体)

4. lambda表达式使用

4.1 语法格式一

无参无返回值

publicvoidtest01(){Runnable ri =newRunnable(){@Overridepublicvoidrun(){System.out.println("好好学习,天天向上");}};
        ri.run();}
publicvoidtest02(){Runnable r2 =()->{System.out.println("学会lambda,快乐每一天");};
        r2.run();}

4.2 语法格式二

需要一个参数但无返回值

publicvoidtest05(){Consumer<String> consumer =newConsumer<String>(){@Overridepublicvoidaccept(String s){System.out.println(s);}};
        consumer.accept("这一路上走走停停");}
publicvoidtest06(){Consumer<String> consumer =(String s)->{System.out.println(s);};
        consumer.accept("留下少年漂流的痕迹");}

4.3 语法格式三

数据类型可以省略,由编译器去推断出,称为“类型推断”

publicvoidtest05(){Consumer<String> consumer =newConsumer<String>(){@Overridepublicvoidaccept(String s){System.out.println(s);}};
        consumer.accept("这一路上走走停停");}
publicvoidtest06(){Consumer<String> consumer =(s)->{System.out.println(s);};//类型推断
        consumer.accept("留下少年漂流的痕迹");}

这里有些类似于使用集合类是前面指明过泛型后,后边不需要再次指明

4.4 语法格式四

lambda若只需要一个参数时,参数的小括号可以省略

publicvoidtest05(){Consumer<String> consumer =newConsumer<String>(){@Overridepublicvoidaccept(String s){System.out.println(s);}};
        consumer.accept("这一路上走走停停");}
publicvoidtest06(){Consumer<String> consumer = s->{System.out.println(s);};//类型推断
        consumer.accept("留下少年漂流的痕迹");}

4.5 语法格式五

lambda需要两个或以上的参数,多条执行语句,并且可以有返回值

publicvoidtest03(){Comparator<Integer> comparator =newComparator<Integer>(){@Overridepublicintcompare(Integer o1,Integer o2){System.out.println(o1);System.out.println(02);returnInteger.compare(o1,o2);}};int compare = comparator.compare(12,21);System.out.println(compare);}
publicvoidtest04(){Comparator<Integer> comparator =(o1,o2)->{System.out.println(o1);System.out.println(02);returnInteger.compare(o1,o2);};int compare = comparator.compare(32,23);System.out.println(compare);}

4.6 语法格式六

当lambda体只有一条语句时,return与大括号若有,都可以省略

publicvoidtest03(){Comparator<Integer> comparator =newComparator<Integer>(){@Overridepublicintcompare(Integer o1,Integer o2){returnInteger.compare(o1,o2);}};int compare = comparator.compare(12,21);System.out.println(compare);}
publicvoidtest04(){Comparator<Integer> comparator =(o1,o2)->Integer.compare(o1,o2);int compare = comparator.compare(32,23);System.out.println(compare);}

5. 总结

lambda

接口的实质:作为函数式接口的实例,关键是这个匿名内部类的简化,省略。

标签: java jvm 算法

本文转载自: https://blog.csdn.net/m0_64102491/article/details/127272988
版权归原作者 不遇言熙 所有, 如有侵权,请联系我们删除。

“Lambda表达式详解”的评论:

还没有评论