方法的引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用

方法的引用分类

静态方法引用

如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用(静态方法的引用与实例方法的引用基本不受限制,只要满足调用条件即可)

静态方法引用示例代码:

/**
* @auther hhh
* @date 2018/12/28 23:02
* @description 如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用
* 语法:类名::staticMethod
* 注意:
* 方法的引用不需要括号,因为其仅仅是方法的引用,并没有执行
* 使用的函数式接口输入输出必须与定义的函数式接口一致
*/
public class StaticMethodUse{
static <T> String hello(T s) {
return s.toString();
}
static <T> String ret() {
return "hello";
}
static void getSize(String s) {
System.out.println(s.length());
}
static String toUpCase(String s){
return s.toUpperCase();
}
public static void main(String[] args) {
Supplier<String> supplier = () -> hello("hello");
//使用方法引用 Supplier T get();
// 1、只支持输出参数,不支持输入参数,所以一下方法报错
//2、方法的引用为什么不需要括号?因为其仅仅是方法的引用,并没有执行
//Supplier<String> stringSupplier = StaticMethodUse::hello("wqer");
Supplier<String> s = StaticMethodUse::ret;
Supplier<String> supplier1 = Fun::put;
Function<Integer, String> function = StaticMethodUse::hello;
//方法的参数必须在调用的时候传入,必须调用函数式接口
System.out.println("function" + function.apply(123)); //普通lambda使用
Consumer<String> consumer = size -> StaticMethodUse.getSize(size);
//方法的引用为什么不需要括号?因为其仅仅是方法的引用,并没有执行
Consumer<String> c1 = StaticMethodUse::getSize;
c1.accept("hello use lambda"); //输出参数大写
Function<String ,String> function1 = (ss) -> ss.toUpperCase();
Function<String,String> function2 = StaticMethodUse::toUpCase;
Function<String,String> function3 = Fun::toUpCase;
System.out.println(function1.apply("aasdf"));
System.out.println(function2.apply("aasdf"));
System.out.println(function3.apply("aasdf"));
}
} class Fun {
static String put() {
return "hello";
}
static String toUpCase(String s){
return s.toUpperCase();
}
}

实例方法引用

如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用

示例代码:

/**
* @auther hhh
* @date 2018/12/28 23:29
* @description 实例方法引用
* 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用
* 语法: new instMethod()::method
* 注意:后面不需要加括号也不需要加参数
*/
public class InstantMethodUse extends Base {
String put() {
return "hello";
} public String toUpCase(String s) {
return s.toUpperCase();
} //调用当前实例的方法
void test() {
UnaryOperator<String> unaryOperator = this::toUpCase;
System.out.println(unaryOperator.apply("this inst method"));
//调用父类的实例方法
UnaryOperator<String> u1 = super::toUpCase;
System.out.println(u1.apply("use super upCase method"));
} public static void main(String[] args) {
Supplier<String> stringSupplier = () -> new InstantMethodUse().put();
Supplier<String> stringSupplier1 = () -> {
return new InstantMethodUse().put();
};
Supplier<String> stringSupplier2 = new InstantMethodUse()::put;
//普通lambda表达式使用
Supplier<String> stringSupplier3 = () -> new InstantMethodUse().put();
System.out.println(stringSupplier2.get());
//两种方式使用
UnaryOperator<String> unaryOperator = new InstantMethodUse()::toUpCase;
//新建对象引用
InstantMethodUse instantMethodUse = new InstantMethodUse();
UnaryOperator<String> unaryOperator1 = instantMethodUse::toUpCase;
System.out.println(unaryOperator.apply("lambda instMethod Use") + " === " + unaryOperator1.apply("lambda instMethod Use")); instantMethodUse.test();
}
}

Java8 Lambda表达式实战之方法引用(一)的更多相关文章

  1. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  2. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  3. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

  4. Java8 lambda表达式10个示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  5. Java8 lambda表达式10个示例<转>

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  6. java8 lambda表达式应用

    1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...

  7. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

  8. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  9. java8 Lambda表达式的10个例子(转)

    原文:http://jobar.iteye.com/blog/2023477 Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 收藏代码// ...

随机推荐

  1. IEEP部署企业级网络工程-网络故障-环路故障

    网络故障 1.环路故障 概念 1).以太网是一个支持广播的网络, 在没有环路的环境中,广播报文在网络中以泛洪的形式被送达到网络的第一个角落,以保证每个设备都能够接受到它.每台二层设备在接收到广播报文以 ...

  2. 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏

    1.  在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2.  如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...

  3. tree 向下查找 (删除整条tree)

    需求:通过点击获取需要删除的id(即获取到整条信息),如果该条数据没有子集,通过id删除即可,如果有子集,则该数据下所有的子集都需要删 删除后页面的数据更新在 下一篇 讲解 1 const id =' ...

  4. 最详细的Vue Hello World应用开发步骤

    很多Vue的初学者想尝试这个框架时,都被webpack过于复杂的配置所吓倒,导致最后无法跑出一个期望的hello word效果.今天我就把我第一次使用webpack打包一个Vue Hello Worl ...

  5. Docker技术三大要点:cgroup, namespace和unionFS的理解

    www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...

  6. [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

    关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇 ...

  7. libevent-signal(1)

    现在已经知道,libevent有三种事件类型,分别是时钟事件,信号事件,i/o事件.今天就分析一下信号事件,下面是一个简单的信号事件demo #include <sys/types.h> ...

  8. linux一切皆文件之文件描述符

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件.如:普通文件.目录.字符设备.块设备.套接字等2.当一个文件被进程打开,就会创建一个文件描述符.这时候,文件的路径就成 ...

  9. 2018 Multi-University Training Contest 3 Problem F. Grab The Tree 【YY+BFS】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6324 Problem F. Grab The Tree Time Limit: 2000/1000 MS ...

  10. Redis配置文件(1)units/includes/GENERAL/SECURITY/LIMITS

    redis.conf文件 在Linux进行文件的查看! units单位: # Note on units: when memory size is needed, it is possible to ...