Java8 新特性 方法引用
什么是方法引用
方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式。比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用:就是让你跟据已有的方法来创建一个Lamdba表达式。
并且这么做还有一个好处,就是可以更加清晰明白的理解这行代码的意思。让代码变的优雅起来。
方法引用的简单使用
//比如说有一个Person类,里面有一个getName()方法。
//用Lamdba来使用:用函数类型接口
Function<Person,String> function = (x) -> x.getName();
//等效的方法引
Function<Person,String> function = Person::getName;
//用Lamdba来使用
() -> Thread.currentThread().dumpStack()
//等效的方法引用
() -> Thread.currentThread::dumpStack
//用Lamdba来使用
(str,i) -> str.substring(i)
//等效的方法引用
(str,i) -> String::sbustring;
//经常使用的集合的输出
list.forEach(System.out::println)
上面的小例子来自 《Java8实战》
方法引用的构建
- 指向静态方法的引用。(引用类型中的方法,如:Integer中的sum,min,max等)
- 指向任意类型实例方法的引用(只要传进来,可以用lamdba,就可以用方法引用)
- 指向现有对象的实例方法的引用(自己定义的对象,传进lamdba表达式以后,就可以用方法引用了)
有参数的情况下,编译器会进行类型检查,来确定对于给定的函数式接口,这个方法引用是否有效,并且参数类型是否于上下文匹配。
使用方法引用来构建一个对象
在这里先定义一个javabean,Person ,属性有两个 name , sex ,有一参构造方法,有两参构造方法,无参构造方法
- 用无参方法构建一个对象
@Test
public void test2() {
Supplier<Person> supplier = Person::new;
Person person = supplier.get();
}
- 用一个参数的构造方法来构建一个对象
@Test
public void test2() {
Function<String, Person> function = Person::new;
Person person = function.apply("张三");
System.out.println(person.getName());
//最后输出:张三
}
- 用二个参数的构造方法来构建一个对象
BiFunction<T,U,R> 两个参数来构建一个对象,得用这个函数式接口:
T:第一个参数类型
U:第二个参数类型
R:返回值类型
@Test
public void test2() {
BiFunction<String,String, Person> function = Person::new;
Person person = function.apply("张三","男");
System.out.println(person.getName());
System.out.println(person.getSex());
//输出:张三 男
}
- 如果用多个参数来构建对象(三个或者三个以上)就必须自己写一个函数式接口
//自定义一个函数接口
@FunctionalInterface
public interface ThreeFuntion <T,U,E,R> {
R apply(T t,U u,E e);
//T:第一个参数类型
//U:第二个参数类型
//E:第三个参数类型
//R:返回值类型
}
细节决定成败!
个人愚见,如有不对,恳请扶正!
Java8 新特性 方法引用的更多相关文章
- JAVA8新特性——方法引用
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法.然而,有时候我们仅仅是需要调用一个已存在的方法(如 ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
- java8新特性-方法引用
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...
- Java8新特性 - 方法引用与构造器引用
方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...
- 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 新特性列表如下: 接 ...
随机推荐
- 通过Maven发部项目的最实用配置
一.问题 我们平时开发项目,使用Maven或者Idea部署,尽可能是要做到自动化.一般情况下,做成自动化的方式有多种,下面简述我比较常用的3种. 二.解决方案一: (1)配置发部:使用IDEA自带的A ...
- FreeBSD虚拟机 VMware Tools 安装教程
对于 FreeBSD 虚拟机,您可以使用命令行工具手动安装或升级 VMware Tools 前提条件 开启虚拟机. 确认客户机操作系统正在运行. 因为 VMware Tools 安装程序是使用 Per ...
- React路由安装使用和多种方式传参
安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from " ...
- git的clone
在使用git来进行版本控制时,为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s):/ ...
- android studio学习---Android studio 导入github工程
无论是那种方式,都最好是先把github上的工程项目下载到本地,然后修改文件再import 首先要知道 自己的build.gradle,在project下面的版本号是多少,比如我的: depende ...
- sigaction信号处理
1. sigaction int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); signu ...
- MySQL truncate含有外键约束的条目报错
1.报错信息: Cannot truncate a table referenced in a foreign key constraint 2.出现错误操作: truncate table a1; ...
- Eclipse properties配置文件中文乱码设置
1. eclipse中properties的默认编码为 ISO-8859-1, 输入汉字会被转换为unicode 2. 点击 Windows-->preferences 按下图找到更改编码 ...
- windows server 2012配置php环境教程
买了windows系统的服务器(VPS)等之后我们需要一个php环境来搭建自己的项目,这里介绍手工在windows server 2012上面配置php环境的具体步骤,适合使用服务器和VPS等的新手. ...
- 指针专题6-空指针NULL和void指针
1 NULL指针 一个指针变量可以指向计算机中任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给他,他就可以指向.C语言没有一种机制保证指向内存的正确性,程序员必须自己提高 ...