java-方法引用
/**
* 方法引用格式:
* 双冒号:: 引用运算符,它所在的表达式被称为方法引用。如果Lambda表达式
* 的函数方案已经存在于某个地方的实现中,
* ===》那么可以通过双冒号来引用改方法作为Lambda表达式的代替者
*/
例子:
public class Demo01Print {
private static void printString(Printable p){
p.print("quan");
}
public static void main(String[] args) {
printString((s)->{
System.out.println(s);
});
/**
* 表达式的目的:打印参数传递的字符串
* 把参数s,传递给System.out对象,调用out对象的pringln方法进行输出
* System.out对象已经存在
* pringln方法已经存在
* =====》可以使用方法引用来优化表达式
* 就是使用system.out方法直接引用(调用)pringln方法。
*/
printString(System.out::println);
}
结果输出:
quan
quan

通过对象名引用成员方法
最常见的一种用法,其实就是上面的做法:
/**
* 通过对象名引用成员方法
* 前提:
* 对象名存在,方法名存在
* 就可以使用对象名来引用成员方法
*/
例子:
1先创建对象类
public class MethodRefObject {
public void pringUpperCaseString(String s){
System.out.println(s.toUpperCase());
}
}
2创建函数式接口
@FunctionalInterface
public interface Printable {
//定义字符串的抽象方法
void print(String s);
}
3测试方法:
public class Demo01MethodRefObject {
private static void pringString(Printable p){
p.print("quan");
}
public static void main(String[] args) {
pringString((s)->{
//创建MethodRefObject对象
MethodRefObject obj = new MethodRefObject();
//调用对象里面的成员方法pringUpperCaseString把字符
//串按照大写输出
obj.pringUpperCaseString(s);
});
//使用方法引用优化,先创建MethodObject对象
MethodRefObject obj = new MethodRefObject();
pringString(obj::pringUpperCaseString);
}
}
/**
* re:
* QUAN
* QUAN
**/
通过类名称引用静态方法
/**
* 通过类名引用静态承焰方法
* 前提:
* 类已经存在,静态成员方法存在
*
*/
例子:
public class Demo01StaticMethodReference {
//定义一个方法,方法的参数传递要计算的整数和函数式接口Calcable
private static int method(int num,Calcable c){
return c.calAbs(num);
}
public static void main(String[] args) {
//调用method方法
int i =method(-10,(n)->{
//计算绝对值,使用的是Math类当中的静态方法abs
return Math.abs(n);
});
System.out.println(i);
/**
*使用方法引用优化Lambda表达式
* Math类存在
* abs计算绝对值静态方法存在
*/
int i1 = method(-10,Math::abs);
System.out.println(i1);
}
}
通过supper引用父类的成员方法
存在子父关系
创建一个父类
//父类
public class Human {
public void sayHello(){
System.out.println("say hello");
}
}
创建一个函数式接口
@FunctionalInterface
public interface Greetable {
void greet();
}
创建一个子类:
public class Man extends Human{
@Override
public void sayHello() {
System.out.println("hello,I'm Man");
}
public void method(Greetable g){
g.greet();
}
public void show(){
method(()->{
//创建父类
Human human = new Human();
human.sayHello();
});
/**
* 存在子夫类关系,存在super关键字,代表父类
* 直接通过super调用父类成员方法
*/
method(()->{
super.sayHello();
});
/**
* 通过super引用类的成员方法
*/
method(super::sayHello);
}
public static void main(String[] args) {
new Man().show();
new Man().sayHello();
}
}
结果:
say hello
say hello
say hello
hello,I'm Man
通过this引用成员方法
this代表当前对象,如果需要引用的方法就是当前类中的成员方法。
可以使用this::成员方法来使用方法引用
定义一个接口
@FunctionalInterface
public interface Richable {
void buy();
}
/**
* 通过this引用奔雷成员方法
*/
public class Husbard {
public void buyHome(){
System.out.println("买房子");
} public void marry(Richable r){
r.buy();
} public void soHappy(){
marry(()->{
//使用this成员方法
this.buyHome();
});
/**
* 使用方法引用优化Lambda表达式
*/
marry(this::buyHome);
} public static void main(String[] args) {
new Husbard().soHappy();
} }
类的构造器引用
构造器和类名完全一致,所以使用方式为:类名称::new的格式表示。
定义一个函数式接口
/**
* 定义一个创建Person对象的函数式接口
*/
@FunctionalInterface
public interface PersonBuilder {
//根据姓名创建Person对象返回
Person builderPerson(String name);
}
一个要被创建的类Person
public class Person {
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 类的构造器引用
*/
public class Demo {
public static void printName(String name,PersonBuilder builder){
Person person = builder.builderPerson(name);
System.out.println(person.getName());
} public static void main(String[] args) {
printName("quan",(name)->{
return new Person(name);
});
/**
* 使用方法引用优化lambda表达
*/
printName("quan2",Person::new);
}
}
//re:quan
// quan2
数组构造器的引用
数组是Object的子类对象,同样具有构造器,但是语法不太一样
/**
* 数组的构造器引用
* 数组::new
* 例子:int[]::new
*/
创建一个接口
//创建数组的函数式接口
@FunctionalInterface
public interface ArrayBuilder {
//返回一个给定长度的int类型数组
int[] builderArray(int length);
}
public class Demo1 {
public static int[] createArray(int length,ArrayBuilder ab){
return ab.builderArray(length);
}
public static void main(String[] args) {
//调用create方法,传递数组长度和表达式
int[] lenint = createArray(12,(len)->{
return new int[len];
});
System.out.println(lenint.length);
//优化,int[]就是数组的构造函数名字
int[] lenint2 = createArray(15,int[]::new);
System.out.println(lenint2.length);
}
}
//re:12
// 15
java-方法引用的更多相关文章
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- Java 方法引用_特性
JAVA8 方法引用:(四种方法引用的使用) 对象引用的特点:不同的对象可以操作同一块的内容:而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字. 引用静态方法: 类名称 :: sta ...
- java 方法引用(method reference)
it -> it != null等价于Objects::nonNull
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...
- Java 8函数编程轻松入门(四)方法引用
C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- Java 8新特性-4 方法引用
对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法 ClassName :: staticMetho ...
- JAVA 8 方法引用 - Method References
什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...
- [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...
- Upgrading to Java 8——第二章 Method References(方法引用)
概述 很多java 方法会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: pu ...
随机推荐
- Go1.14版本vendor和gomodule冲突问题
Go1.14版本vendor和gomodule冲突问题 go1.14版本使用go mod tidy构建依赖时会出现问题(见链接), 这个问题在go1.12版本是不会出现的. https://githu ...
- 激活visio pro 2019
内容来源:http://www.yishimei.cn/catalog.asp?page=2 1.必须彻底关闭windows defender 防火墙 :光笔防火墙的教程:https://www.cn ...
- 开发Windows程序的三种方式
软件开发方式一共有三种:SDK方式.MFC开发方式.托管环境的开发都是基于消息的开发 SDK方式 原装api的调用SDK方式使用C语言和Windows应用程序编程接口(Windows API)来开发W ...
- MySQL:修改MySQL登录密码
在MySQL cmd中: 1.1:ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密 ...
- python刷剑指offer(1-20)(一刷)
2019/07/28开始刷每天6题,一共66题,刷三遍,9月1号完成. 1.二维数组中的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...
- 能动的电脑配件「GitHub 热点速览 v.22.11」
看到这个标题就知道硬核的 B 站 UP 主稚晖君又更新了,本次带来的是一个造型可爱的小机器人.除了稚晖君这个一贯硬核的软硬件项目之外,本周也有很多有意思的新项目,像 Linux 服务监控小工具 Ray ...
- CF1392F题解
首先题意很明显就不说了吧www 先说一下做这道题的经历 昨天下午和 blw 一起去食堂吃饭,和他产生了一点儿冲突,于是我考了一下他 P1119 (就是那道 Floyd),他很快做出来了,于是考了我这道 ...
- Redis 大 key 问题总结
多大的 key 算大? 阿里云Redis 最佳实践中提到 合理的 Key 中 Value 的字节大小,推荐小于10 KB.过大的 Value 会引发数据倾斜.热点Key.实例流量或 CPU 性能被占满 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- 旅游清单一步搭建,Angular助力你的踏春计划
春天的脚步愈发临近,相信很多小伙伴已经开始规划自己的踏春计划了,无论是欣赏名胜古迹,还是走访风土人文,你都需要提前准备一份旅游清单!有了这款Angular旅游计划应用,从地点到预算,它都能帮助你创建自 ...