当前位置: 首页 > news >正文

Lambda表达式第四版

1、冗余的Runnbale代码

package com.lambda;public class Demo01Runnable {public static void main(String[] args) {RunnableImpl runnable = new RunnableImpl();Thread thread = new Thread(runnable);thread.start();//Lambda表达式}
}class RunnableImpl implements Runnable {@Overridepublic void run() {System.out.println("Lambda表达式");}
}
package com.lambda;public class Demo01Runnable {public static void main(String[] args) {//        Runnable r = () -> System.out.println("Lambda表达式");//        new Thread(r).start();//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("Lambda表达式");
//            }
//        }).start();new Thread(() -> System.out.println("Lambda表达式")).start();//Lambda表达式}
}

2、匿名内部类的好处与弊端

  1. 一方面,匿名内部类可以帮我们省去实现类的定义
  2. 另一方面,匿名内部类的语法——确实太复杂!

3、Lambda标准格式

Lambda省去面向对象的条条框框,格式由3个部分组成:

  • 一些参数
  • 一个箭头
  • 一段代码
  • 格式:(参数列表)->  {一些重写方法的代码}
  • ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用逗号分隔
  •   ->  :传递的意思,把参数传递给方法体 { }
  •   {}   :  重写接口的抽象方法的方法体

 4、Lambda表达式的无参数无返回值的练习

package com.lambda;public class Demo1Lambda {public static void main(String[] args) {//        invokeCook(new Cook() {
//            @Override
//            public void makeFood() {
//                System.out.println("吃饭了");
//            }
//        });invokeCook(()-> System.out.println("吃饭了"));//吃饭了}public static void invokeCook(Cook cook) {cook.makeFood();}
}interface Cook {void makeFood();
}

5、 Lambda表达式有参数有返回值的练习(自定义类)

package com.lambda;import java.util.Arrays;public class Demo2Lambda {public static void main(String[] args) {Person person1 = new Person("小明",23);Person person2 = new Person("小红",33);Person person3 = new Person("小蓝", 17);Person[] arr = {person1, person2, person3};//        Arrays.sort(arr, new Comparator<Person>() {
//            @Override
//            public int compare(Person o1, Person o2) {
//                return o1.getAge() - o2.getAge();
//            }
//        });//        Arrays.sort(arr, (Person o1, Person o2) -> {
//            return o1.getAge() - o2.getAge();
//        });Arrays.sort(arr, (o1, o2) -> o1.getAge() - o2.getAge());System.out.println(Arrays.toString(arr));}}class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

6、Lambda表达式有参数有返回值的练习(自定义接口) 

package com.lambda;public class Demo3Lambda {public static void main(String[] args) {//        invokeCalc(new Calculator() {
//            @Override
//            public int calc(int a, int b) {
//                return a + b;
//            }
//        });//        invokeCalc((int a, int b) -> {
//                    return a + b;
//                }
//        );invokeCalc((a, b) -> a + b);//250}public static void invokeCalc(Calculator c) {int calc = c.calc(120, 130);System.out.println(calc);}
}interface Calculator {int calc(int a, int b);
}
package com.lambda;public class Demo4Lambda {public static void main(String[] args) {//        invokeCalc(120, 130, new Calculator() {
//            @Override
//            public int calc(int a, int b) {
//                return a + b;
//            }
//        });//        invokeCalc(120, 130, (int a, int b) -> {
//            return a + b;
//        });invokeCalc(120, 130, (a, b) -> a + b);//250}public static void invokeCalc(int a, int b, Calculator c) {int sum = c.calc(a, b);System.out.println(sum);}
}interface Calculator {int calc(int a, int b);
}

7、Lambda省略格式

  • Lambda表达式:是可推导,可以省略
  • 凡是根据上下文推导出来的内容,都可以省略书写
  1. (参数列表):括号中参数列表的数据类型,可以省略不写
  2. (参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
  3.   {一些代码}  :如果{}中的代码只有一行,无论是否有返回值,都可以省略({ },return,分号),注意:要省略 { },return,分号必须一起省略   

8、Lambda的使用前提 

Lambda的语法非常简单,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:

  1. 使用Lambda必须具有接口,且要求 接口 中有且仅有一个抽象方法
  2. 无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只能当接口中的抽象方法存在且唯一时,才可以使用Lambda
  3. 使用Lambda必须具有上下文推断。
  4. 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

备注:有且仅有一个抽象方法的接口,称为“函数式接口”。

http://www.lryc.cn/news/152569.html

相关文章:

  • 自定义类加载器
  • 【Redis】Redis 的学习教程(七)之 SpringBoot 集成 Redis
  • Vlan和Trunk
  • java 批量下载将多个文件(minio中存储)压缩成一个zip包
  • nnUNet v2数据准备及格式转换 (二)
  • ant-vue1.78版监听a-modal遮罩层的滚动事件
  • MATLAB中residue函数用法
  • 攻防世界-Caesar
  • 嵌入式开发-lin总线介绍 一.概述
  • 羊城杯-2023-Crypto
  • RabbitMQ快速上手及讲解
  • 使用多线程std::thread发挥多核计算优势(解答)
  • MySQL分页查询详解:优化大数据集的LIMIT和OFFSET
  • 解构赋值、函数默认值
  • 【已解决】Mybatis 实现 Group By 动态分组查询
  • Android修改默认gradle路径
  • 原生JS+canvas实现炫酷背景
  • Linux学习之NAS服务器搭建
  • 分享码云上8个宝藏又有价值的开源图片编辑器
  • TCP Header都有啥?
  • 无涯教程-Android - AutoCompleteTextView函数
  • 【Docker】 07-安装ElasticSearch、Kibana
  • 【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)
  • C语言每日一练--Day(17)
  • 8月琐碎但值得的事情
  • 苹果Mac系统如何优化流畅的运行?提高运行速度
  • Python 类和对象
  • VC++使用Microsoft Speech SDK进行文字TTS朗读
  • FFmpeg4.3.1+h264在windows下编译与VS2017项目集成
  • mapboxGL3新特性介绍