java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题。今天来简单学习一下方法引用与构造器引用。
一、方法引用
方法引用:若lambda 体中得内容已经有方法实现了,我们可以使用方法引用(可以理解为方法引用为lambda表达式得另一种表现形式)
@Test
public void test1() {
Consumer<String> con = (x) -> System.out.println(x); //下面这种写法与上面写法效果一致
PrintStream pr = System.out;
Consumer<String> con1 = pr :: println;
}
要想使用方法引用,就必须实现得方法得返回值和参数与函数式接口中得返回值和参数所一致。
我们来看下java8中内置得Consumer接口中得accept方法。
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
我们再看下println方法。
/**
* Prints a String and then terminate the line. This method behaves as
* though it invokes <code>{@link #print(String)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>String</code> to be printed.
*/
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
因为他们得返回值一致,参数也一致,所以可以这样使用方法引用。
@Test
public void test2() {
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
int b = com.compare(5, 6); Comparator<Integer> com1 = Integer :: compare;
int c = com1.compare(7, 8);
}
如果是静态方法的话,首先也是要返回值和参数与Comparator中的compare方法得一致,然后可以直接使用类名 :: 方法名去引用这个方法。上面得接口中得实现已经由Integer中得compare方法实现了,而且两个方法得返回值与参数都一致,所以,可以这样 使用。
@Test
public void test3() {
BiPredicate<String, String> bi = (x, y) -> x.equals(y); BiPredicate<String, String> bi1 = String :: equals;
}
这类引用就比较特殊了,这类引用要求第一个入参的类型必须时调用方法的实例,第二二个参数必须时方法得参数才可以使用这种类型得引用。
二、构造器引用
格式: ClassName :: new
@Test
public void test4() {
Supplier<Encoder> su = () -> new Encoder(); Supplier<Encoder> su1 = Encoder :: new;
}
上面时调用无参构造器
@Test
public void test5() {
Function<Integer, Integer> fun = (x) -> new Integer(x); Function<Integer, Integer> fun1 = Integer :: new;
}
上面是调用有参构造器。
上面得2个方法调用什么构造器,主要取决于函数式接口中参数得个数和类型。
三、数组引用
格式 :Type :: new
@Test
public void test6() {
Function<Integer, String[]> fun = (x) -> new String[x]; Function<Integer, String[]> fun1 = String[] :: new;
}
上面得方式,我们可以快速得创建数组。
java8新特性——方法引用与构造器引用的更多相关文章
- JAVA8新特性——方法引用
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法.然而,有时候我们仅仅是需要调用一个已存在的方法(如 ...
- Java8新特性 - 方法引用与构造器引用
方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...
- java8新特性-方法引用
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...
- Java8 新特性 方法引用
什么是方法引用 方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式.比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用 ...
- Java8新特性之方法引用&Stream流
Java8新特性 方法引用 前言 什么是函数式接口 只包含一个抽象方法的接口,称为函数式接口. 可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即:非运行 ...
- Java8新特性—四大内置函数式接口
Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
随机推荐
- 集合框架小结-Collection
1.集合框架作为处理对象的容器存在,基本接口是Collection,相对于数组而言的话,集合框架只能存储对象,但是长度是可变的.集合框架的关系图如下: 主要的内容是list.set.map, List ...
- react系列一,react虚拟dom如何转成真实的dom
react,想必作为前端开发一定不陌生,组件化以及虚拟dom使得react成为最受欢迎额前端框架之一.我们知道react是基于虚拟dom的,但是什么是虚拟dom呢,其实就是一组js对象,那么我们今天就 ...
- 带你优雅的使用 icon
前言 本篇文章其实陆陆续续写了快半年,主体部分写好了很久了,但由于种种原因一直没有发布.首先来说说写这篇文章的主要初衷是:在做前端后台项目的时候经常会用到很多 icon 图标,刚开始还好,但随着项目的 ...
- hdu 2063 过山车 二分匹配(匈牙利算法)
简单题hdu2063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Ot ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- 在64位ubuntu中安装代码比较工具beyond compare
1,//从http://www.scootersoftware.com/download.php 官方地址下载 bcompare-3.3.2.14050.tar.gz 或 bcompare-4.0.7 ...
- curl: (6) Couldn’t resolve host ‘www.ttlsa.com’【转】
上周, 部分站点出现Couldn't resolve host.....问题, 导致公司所有走api的程序都无法正常使用(系统redhat 6.3的都出现问题, redhat 5一切OK). 最后解 ...
- 自动化运维工具SaltStack详细部署【转】
==========================================================================================一.基础介绍==== ...
- 关于DataTable.Select不到数据的一种解决方案
网上有很多说的,试过,都没用.自己研究了一下,解决方案如下: 建立dataview,用dv.rowfilter,就可以取到了,然后TOTABLE即可. 代码如下:(只看中间那几句即可) private ...
- serialVersionUID的作用(转)
本文系转载,原文链接:http://swiftlet.net/archives/1268 serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的ser ...