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 新特性列表如下: 接 ...
随机推荐
- ASP.NET站点Web部署(一键发布的实现)
在开发过程中经常需要发布到开发环境.测试环境或者预发布环境上给其他同事进行测试验证效果等等,每次发布都要备份,拷贝,修改配置文件等等重复操作非常的麻烦,效率大打折扣,而web部署提供了这样的解决方案: ...
- [转]FILE的用法
#include <stdio.h> int main() { char c; ; FILE *file; file = fopen("test.txt", " ...
- JSDom
什么是Dom? 1.简介 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口.Document Object Model的历史可 ...
- Python中单引号,双引号,三引号
1.单引号与双引号的区别 s1=‘let‘s go’(明显我们是想用单引号表示let’s go这个字符串的,但是python只知道用‘’来表示字符串,所以python就把字符串中的‘字符当成单引号处理 ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
- C++学习之路(十):虚继承引入的执行效率
这篇文章不知道取啥名字了,暂且这样叫,直接看场景就明白了.节选自<深度探索C++对象模型> Point3d origin, *pt = &origin; (1)origin.x = ...
- 008 BlockingQueue理解
原文https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇将详细介绍BlockingQueue,以下是涉及的主要内容: BlockingQueue的 ...
- 在ubuntu上安装Chrome
1.下载谷歌浏览器源文件.链接有很多,以下是64位版本的下载地址 https://dl.google.com/linux/direct/google-chrome-stable_current_amd ...
- leetcode 168. Excel Sheet Column Title 171 Excel Sheet Column Number
题目 //像10进制一样进行 转换 只是要从0开始记录 class Solution { public: string convertToTitle(int n) { char a; string ...
- LightOJ 1369 Answering Queries(找规律)
题目链接:https://vjudge.net/contest/28079#problem/P 题目大意:给你数组A[]以及如下所示的函数f: long long f( int A[], int n ...