/**
* 方法引用格式:
* 双冒号:: 引用运算符,它所在的表达式被称为方法引用。如果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-方法引用的更多相关文章

  1. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  2. Java 方法引用_特性

    JAVA8 方法引用:(四种方法引用的使用) 对象引用的特点:不同的对象可以操作同一块的内容:而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字. 引用静态方法: 类名称 :: sta ...

  3. java 方法引用(method reference)

    it -> it != null等价于Objects::nonNull

  4. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  5. Java 8函数编程轻松入门(四)方法引用

    C#中系统提供了许多IEnumerable的扩展方法.同样在Java 8中新引入了Collector类. 1.方法引用 定义: 简而言之:就是一个Lambda表达式.在Java 8中,我们我们会使用L ...

  6. Java笔记——Java8特性之Lambda、方法引用和Streams

    Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...

  7. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  8. JAVA 8 方法引用 - Method References

    什么是方法引用 简单地说,就是一个Lambda表达式.在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对 ...

  9. [转]深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    以下内容转自: 作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-l ...

  10. Upgrading to Java 8——第二章 Method References(方法引用)

    概述 很多java 方法会使用函数式接口作为参数.例如,java.util.Arrays类中的一个sort方法,就接受一个Comparator接口,它就是一个函数式接口,sort方法的签名如下: pu ...

随机推荐

  1. 提权辅助工具:Windows--exploit-suggester.py安装及使用

    下载地址    https://github.com/AonCyberLabs/Windows-Exploit-Suggester1.安装xlrd包(注意python2.3版本的pip问题)      ...

  2. windows server2012 r2 .net framework 3.5失败

    拿到手的虚拟机系统是Windows server 2012R2,本想着安装SQlserver2012轻轻松松,结果途中警告未安装.NET Framework 3.5.于是找了个.NET Framewo ...

  3. [杂记]对RSA算法的数学原理的一点思考

  4. [转自Matrix67] 趣题:顶点数为多少的图有可能和自己互补

    若干个顶点以及某些顶点和顶点之间的连线,就构成了一个"图".如果对某个图进行变换,使得原来任意两个有连线的顶点之间都不再有连线,原来任意两个没有连线的顶点之间现在都有连线了,那么所 ...

  5. [题解]RQNOJ PID85 三个袋子

    链接:http://www.rqnoj.cn/problem/85 思路:一个排列问题,递推式很简单,f(n+1)=3*f(n)-1 ,由此可以推出通项公式,f(n)=0.5*3^(n-1)+0.5 ...

  6. 解除Ubuntu禁止root远程登录

    编辑SSH服务配置文件 编辑SSH服务的配置文件sshd_config,修改SSH的端口和root用户权限. 使用到的命令:(按字母 i 进入编辑模式,按ESC退出编辑模式, :wq 保存退出). r ...

  7. 1.分类维护-通过Java8 Stream API 获取商品三级分类数据

    实体类 @Data @TableName("pms_category") public class CategoryEntity implements Serializable { ...

  8. c++ stringstream 实现字符串与int之间的转换

    #include <iostream> #include <sstream> using namespace std; int main() { //string转int st ...

  9. C语言do-while语句

    "直到"型 (do-while) 语句的特点: 先执行循环,然后判断条件是否成立.

  10. Git如何使用,操作流程

    官方示例 git config --global user.name "sanqianll" git config --global user.email "224001 ...