第九章 Lambda&方法引用
9.1、Lambda表达式
9.1.1、标准格式
(形式参数) -> {代码块}
9.1.2、使用前提
有一个接口并且接口中有且仅有一个抽象方法
9.1.3、常见应用
9.1.3.1、无参无返回值抽象方法练习
interface MyInter {
void show();
}
public class Main {
public static void main(String[] args) {
myInterShow(() -> System.out.println("Hello,World"));
}
public static void myInterShow(MyInter mi) {
mi.show();
}
}
9.1.3.2、有参无返回值抽象方法练习
interface MyInter {
void show(String s);
}
public class Main {
public static void main(String[] args) {
myInterShow((s) -> System.out.println(s));
}
public static void myInterShow(MyInter mi) {
mi.show("Hello,World");
}
}
9.1.3.3、有参有返回值抽象方法练习
interface MyInter {
int show(int x, int y);
}
public class Main {
public static void main(String[] args) {
myInterShow((x, y) -> x + y);
}
public static void myInterShow(MyInter mi) {
int show = mi.show(10, 20);
System.out.println(show);
}
}
9.1.4、省略模式
- 参数类型可以省略。但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号和return关键字
9.1.5、注意事项
使用Lambda必须要有接口并且要求接口中有且仅有一个抽象方法
必须有上下文环境,才能推导出Lambda对应的接口
- 根据局部变量的赋值得知Lambda对应的接口
Runnable r = () -> System.out.println("Hello,World");
- 根据调用方法的参数得知Lambda对应的接口
new Thread(() -> System.out.println("Hello,World")).start();
9.1.6、Lambda表达式和匿名内部类的区别
- 所需类型不同
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件,对应的字节码会在运行的时候动态生成
9.2、方法引用
9.2.1、概述
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案,拿参数做操作,如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?肯定是没必要,那我们又是如何使用已经存在的方案的呢?我们是通过方法引用来使用已经存在的方案
9.2.2、方法引用符
:: 该符号为引用运算符,而它所在的表达式被称为方法引用
9.2.3、省略模式
方法引用可以根据上下文进行推导,方法引用是Lambda的孪生兄弟
9.2.4、常见应用
9.2.4.1、引用类方法
使用说明:Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数
interface Converter {
int convert(String s);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useConverter(s -> Integer.parseInt(s));
// 引用的方法
useConverter(Integer::parseInt);
}
private static void useConverter(Converter c) {
int number = c.convert("666");
System.out.println(number);
}
}
9.2.4.2、引用类的实例方法
使用说明:Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数
interface MyString {
String mySubString(String s, int x, int y);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useMyString((s, x, y) -> s.substring(x, y));
// 引用的方法
useMyString(String::substring);
}
private static void useMyString(MyString my) {
String s = my.mySubString("HelloWorld", 2, 5);
System.out.println(s);
}
}
9.2.4.3、引用对象的实例方法
使用说明:Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数
class PrintString {
public void printUpper(String s) {
String result = s.toUpperCase();
System.out.println(result);
}
}
interface Printer {
void printUpperCase(String s);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
usePrinter(s -> System.out.println(s.toUpperCase()));
// 引用的方法
PrintString ps = new PrintString();
usePrinter(ps::printUpper);
}
private static void usePrinter(Printer p) {
p.printUpperCase("HelloWorld");
}
}
9.2.4.4、引用构造器方法
使用说明:Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数
class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
interface StudentBuilder {
Student build(String name, int age);
}
public class Main {
public static void main(String[] args) {
// Lambda写法
useStudentBuilder((name, age) -> new Student(name, age));
// 引用的写法
useStudentBuilder(Student::new);
}
private static void useStudentBuilder(StudentBuilder sb) {
Student s = sb.build("林青霞", 30);
System.out.println(s.getName() + "," + s.getAge());
}
}
第九章 Lambda&方法引用的更多相关文章
- JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用
一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...
- java8 lambda方法引用
注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...
- Java自学-Lambda 方法引用
Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: public static boolean testHero(Hero h) { return h.h ...
- Lambda 方法引用
1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ① 对象 :: 实例方法 ...
- Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法
本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...
- Java8新特性 -- Lambda 方法引用和构造器引用
一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...
- Lambda 方法引用 构造器引用 数组引用
一.方法引用 注意: 1.Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值保持一致!2.若Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个 ...
- 《Python基础教程(第二版)》学习笔记 -> 第九章 魔法方法、属性和迭代器
准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here ...
- 《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器(上)
构造方法 在Python中创建一个构造方法很容易.只要把init方法的名字从简单的init修改为魔法版本__init__即可: >>> class FooBar: ... d ...
随机推荐
- 痞子衡嵌入式:kFlashFile v1.0 - 一个基于Flash的掉电数据存取方案
大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的个人小项目 - kFlashFile. 痞子衡最近在参与一个基于 i.MXRT1170 的项目,项目有个需求,需要在 Flash 里实 ...
- Nginx 从入门到放弃(四)
前面我们学习了nginx的基本操作和日志管理,今天我们学习一下生产环境经常会用到的路由定位location设置,在工作中,经常可能会出现怎么设置的路由访问不到网页呀?总是出现404错误啊,这些都很有可 ...
- 创建windows窗口
from tkinter import * win=Tk() #创建窗口对象 win.title("我的第一个gu ...
- 真的可以,用C语言实现面向对象编程OOP
ID:技术让梦想更伟大 作者:李肖遥 解释区分一下C语言和OOP 我们经常说C语言是面向过程的,而C++是面向对象的,然而何为面向对象,什么又是面向过程呢?不管怎么样,我们最原始的目标只有一个就是实现 ...
- 猿灯塔:疫情冲击,去体验远程面试被怼10分钟,今年Java开发找工作真难
网行业,美团王兴曾说:“2019年可能会是过去十年里最差的一年,却是未来十年里最好的一年”.没想到预言竟然快成真了? 年前很多企业一波裁员,2020年又受疫情影响,延长了假期,各大企业复工时间拉长,招 ...
- 好看css搜索框样式_分享8款纯CSS搜索框
最简单实用的CSS3搜索框样式,纯CSS效果无需任何javascript,其中部分搜索框在点击的时候有动画特效,搜索框的应用也是比较普通的,效果如下: 设计网站大全https://www.wode00 ...
- fastjson到底做错了什么?为什么会被频繁爆出漏洞?
GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...
- 「疫期集训day11」沙漠
可恶的英格兰人,为了石油而攻打我们----岂能让他们得逞?----鄂斯曼帝国的士兵 今天整理日,不错不错 写了一天的DP,截一些较好的题: 收获: \(1.\) 对拍更熟练了,主要是线段和合并饭团两题 ...
- 【笔记】在java中String类为什么要设计成final?
部分内容转自知乎:https://www.zhihu.com/question/31345592 从自己的理解进行加工,压缩. String本质上是一个final类 public final clas ...
- MVC + EFCore 项目实战 - 数仓管理系统2- 搭建基本框架配置EFCore
本次课程就正式进入开发部分. 首先我们先搭建项目框架,还是和之前渐进式风格保持一致,除必备组件外,尽量使用原生功能以方便大家理解. 开发工具:vs 2019 或以上 数据库:SQL SERVER 20 ...