目录
lambda 表达式
前言
简介
简单入门
用法
好处
总结
lambda 表达式
前言
最近因为疫情, 也不能正常返校什么的, 希望大家都能好好的, 希望武汉加油, 中国加油, 在家也看了很多视频, 学了一点新的东西, 虽然懒惰, 但是也要努力啊. 今天记录分享 Lambda 表达式的知识.
Lambda 表达式是 JDK8 新增的特性 下面的图就是 JDK8 的新特性, JDK5 和 JDK8 相对来说都是比较重要有的 Java 版本.
所以学习使用其中的新特性也是比较重要的.
简介
Lambda 表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式, 可以用来解决匿名内部类的定义复杂问题.
今天这篇讲的是 lambda 表达式, 它是一种新的语法规则. 它是一种匿名函数, 简单地说, 它是没有声明的方法, 也即没有访问修饰符, 返回值声明和名字. 它可以写出更简洁, 更灵活的代码. 作为一种更紧凑简洁的代码风格, 使 Java 语言的表达能力得到了提升.
简单入门
- interface Message {
- public void print();
- }
- public class TestDemo {
- public static void main(String[] args){
- //lambda 表达式, 这里是覆写接口中的 print 方法
- fun() -> System.out.println("hello world");
- // 原来的写法
- // fun(new Message(){
- // @Override
- // public void print)() {
- // System.out.println("hello world");
- //}
- //});
- }
- public static void print(Message msg){
- msg.print();
- }
- }
用法
Lambda 的基本语法如下
(参数) -> 方法体 / lambda 体
解析:
左边是成员列表 / 形参列表(有时就是接口中的抽象方法的方法引用)
右边的方法体是要重写的抽象方法的方法体
-> 是操作符, 也叫做 lambda 箭头操作符
简单示例
- // 1. 不需要参数, 返回值为
- () -> 1
- // 2. 接收一个参数(数字类型), 返回其 2 倍的值
- x -> 2 * x
- // 3. 接受 2 个参数(数字), 并返回他们的差值
- (x, y) -> x - y
- // 4. 接收 2 个 int 型整数, 返回他们的和
- (int x, int y) -> x + y
- // 5. 接受一个 string 对象, 并在控制台打印, 不返回任何值(看起来像是返回 void)
- (String s) -> System.out.print(s)
具体使用方法 / 写法 - 一共可以分为六种情况去写.
- /**
- * @Author: yhy
- * @Time: 22:37
- * 用来测试使用 lambda 语句
- */
- public class LambdaDemo {
- // -> lambda 操作符
- // 情况一: 无参且无返回值
- @Test
- public void test1() {
- // 原来的写法
- Runnable r0 = new Runnable() {
- @Override
- public void run() {
- System.out.println("abc");
- }
- };
- // lambda 写法
- Runnable r = () -> System.out.println("abc");
- r.run();
- }
- // 情况二 需要一个参数, 但没有返回值
- // 原始写法
- Consumer<String> con = new Consumer<>() {
- @Override
- public void accept(String s) {
- System.out.println(s);
- }
- };
- // lambda 写法
- Consumer<String> con2 = (String s) -> {
- System.out.println(s);
- };
- // 情况三: 数据类型省略, 可推断出类, 又叫做类型推断 前面已经知道是 string 类型了
- // 所以这里直接省略了后面的括号的 string 类型说明
- // 和泛型的格式很像, 可以省略后面的类型说明
- Consumer<String> con3 = (s) -> {
- System.out.println(s);
- };
- // 情况四: 一个参数的时候, 括号可以不写 下面的 s 就是一个参数
- @Test
- public void test2() {
- Consumer<String> con4 = s -> {
- System.out.println(s);
- };
- con4.accept("abcdefg");
- }
- // 情况五: 需要两个或者以上的参数, 且方法中多条执行语句, 并且有返回值
- @Test
- public void test3() {
- // 原来的写法
- Comparator<Integer> com = new Comparator<Integer>() {
- @Override
- public int compare(Integer o1, Integer o2) {
- System.out.println(o1);
- System.out.println(o2);
- return o1.compareTo(02);
- }
- };
- System.out.println(com.compare(13,15));
- // lambda 表达式
- System.out.println("------------------");
- Comparator<Integer> com2 =(o1,o2) -> {
- return o1.compareTo(02);
- };
- System.out.println(com2.compare(14,12));
- }
- // 情况六: 当 lambda 只有一条语句时候, 可以在 lambda 体中省略括号和 return
- @Test
- public void test4(){
- // 原来的写法
- Comparator<Integer> com1 = (o1,o2) -> {return o1;};
- }
- // lambda 规则六表达式写法
- Comparator <Integer> com2 = (o1, o2) -> o1;
- }
好处
能够简洁, 快速写代码, 看的出代码量差别, 但是有一说一, 有时不会很好懂, 但是看得懂还是最基本的要求.
总结
表达式的左边: Lambda 形参列表的参数类型可以省略, 如果只有一个参数的时候, 也可以省略括号
表达式的右边: Lambda 体, 一对 {} 包裹着, 只有一条执行语句的时候, 也可以省略大括号, 若有返回值, 省略的时候也可以省略 return
最后, 以前用匿名内部类的地方都可以使用 Lambda 表达式类代替.
这一篇文字没写多少, 因为我觉得学的太慢了, 不能浪费太多时间在做博客上, 所以以记录分享为主, 菜鸟一枚, 加油, 共勉!
来源: https://www.cnblogs.com/yhycoder/p/12315184.html