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

静态方法引用
如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用(静态方法的引用与实例方法的引用基本不受限制,只要满足调用条件即可)
静态方法引用示例代码:
/**
* @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表达式实战之方法引用(一)的更多相关文章
- [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口
函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...
- 【Java学习笔记之三十一】详解Java8 lambda表达式
Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...
- java8 快速入门 lambda表达式 Java8 lambda表达式10个示例
本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...
- Java8 lambda表达式10个示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...
- Java8 lambda表达式10个示例<转>
例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...
- java8 lambda表达式应用
1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...
- Java8 Lambda表达式、函数式接口和方法引用
目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...
- Java8 Lambda表达式详解手册及实例
先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...
- java8 Lambda表达式的10个例子(转)
原文:http://jobar.iteye.com/blog/2023477 Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 收藏代码// ...
随机推荐
- linu常用命令链接
linux命令大全ps命令详解: http://www.jb51.net/LINUXjishu/151851.html Linux禁止ping以及开启ping的方法: http://www.cnblo ...
- DatagramSocket类 会发生线程阻塞的方法
遇到这个问题,还告诉别人错了,这里来Mark一下. receive()方法会使调用线程阻塞. Java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是 ...
- 32位 64位 获得进程peb的方法
基于上一篇文章,大概了解了peb的获取方法,但是那个方法只能获得当前进程的PEB,不能获得其他的进程的PEB.根据那个思想,获得其他进程PEB则需要注入,得到进程信息,然后进程间通信,将信息返回来,经 ...
- electricity meter就是电表
英式英语metre意思是度量衡里面的单位:米 美式英语拼为 meter 除了“米”,还有一个意思是“计量器”,比如 parking meter就是是路边停车投币计时器,cab meter就是出租车的计 ...
- plus.webview.create mui.openWindow区别是什么呢
create 只是创建这个webview,但是不显示,而且同一个页面.同一个id你甚至能重复创建多个(严重消耗性能,作死...),其实mui里面已经封装了这个方法 mui.preload(),并且 ...
- 一些通过SAP ABAP代码审查得出的ABAP编程最佳实践
1. 这两个IF ELSE分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个IF分支里进行检查: It is an expensive operation to open a file in a ...
- pexpect 初坑
通过一个很坑的任务,最近认识了一个新坑: pexpect .其实基本的用法并不难,不过,我还是跟以前一样,把几个基本函数的坑蹚了个遍.有感而发,记录一下. 首先简单的介绍一下这个坑,哦不对,这个库.这 ...
- Yii 不完全解决方案(一)
此文意在记录 Yii 开发过程中的小问题解决方案 1. Yii 中 Js 和 Css 文件的引入. 我们就从最简单的问题开始吧,说起来也不是问题,只是语法罢了.假设我们的 js 文件都放在和 prot ...
- Thread-Specific-Storage for C/C++
引用出处:https://www.cse.wustl.edu/~schmidt/PDF/TSS-pattern.pdf 摘要: 理论上多线程会提高程序性能,但实际上,由于在获取和释放锁的开销,多线程经 ...
- ethereumjs/ethereumjs-account-1-简介和API
https://github.com/ethereumjs/ethereumjs-account Encoding, decoding and validation of Ethereum's Acc ...