JDK8新特性04 方法引用与构造器引用
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*; /**
* 一、方法引用
* lambda方法体之 --> 方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用"方法引用"
* (可以理解为方法引用是Lambda 表达式的另外一种表现形式)
*
*
* 主要有三种语法格式:
*
* 对象::实例方法名
*
* 类::静态方法名
*
* 类::实例方法名
*
* 注意:
* 1)Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型保持一致!
* 2) 若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用 ClassName::method
* ClassName代表第一个参数的类型,也代表方法调用者的类型
* method的参数类型需要等同于第二个参数的类型
*
* 二、构造器引用
* 格式:
* ClassName:new
* 注意:需要调用的构造器参数列表要与函数式接口中抽象方法的参数列表保持一致
* 三、数组引用
*
*/ public class MethodRef {
public static void main(String[] args) {
test01();
test02();
test03();
test04();
test05();
test06();
test07(); }
/**
* 对象::实例方法名
*/
public static void test01() {
PrintStream out = System.out; //1.lambda表达式 --> 方法的实现
Consumer<String> con2 = (x) -> out.println(x); //2.lambda对象方法的引用 --> 方法的引用
// 前提:引用的方法的参数列表和返回值类型 要与函数式接口的方法的 参数列表和返回值类型一致
Consumer<String> con = System.out::println;
con.accept("abcdef");
} /**
* 对象::实例方法名
*/
public static void test02() {
Employee emp = new Employee();
Supplier<String> sup1 = () -> emp.getName(); //lambda方法体:对匿名类创建的写法的简化
String name = sup1.get();
System.out.println(name); System.out.println("---------------");
Supplier<Integer> sup2 = emp::getAge; //lambda之方法引用:对lambda方法体的引用
Integer age = sup2.get(); System.out.println(age);
} //类::静态方法名
public static void test03() {
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
Comparator<Integer> com2 = Integer::compare;
} /**
* 类::实例方法名
* 前提条件:
* 若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用 ClassName::method
* ClassName代表第一个参数的类型,也代表方法调用者的类型
* method的参数类型需要等同于第二个参数的类型
*/
public static void test04() {
BiPredicate<String,String> pre = (x,y) -> x.equals(y);
BiPredicate<String,String> pre2 = String::equals;
} /**
* 构造器引用 无参数构造器
*/
public static void test05() {
Supplier<Employee> sup = () -> new Employee();
Employee emp = sup.get();
System.out.println(emp); System.out.println("----------");
Supplier<Employee> sup2 = Employee::new;
Employee emp2 = sup2.get();
System.out.println(emp2);
} /**
* 构造器引用 有参数构造器,根据参数类型自动判断
*/
public static void test06() {
Function<Integer,Employee> fun = (x) -> new Employee(x);
Employee emp = fun.apply(1);
System.out.println(emp); System.out.println("----------");
Function<Integer,Employee> fun2 = Employee::new;//泛型中参数类型是Integer
Employee emp2 = fun2.apply(2); //构造器一个参数,自动根据参数类别判断
System.out.println(emp2); System.out.println("----------");
Function<String,Employee> fun3 = Employee::new; //泛型中参数类型是String
Employee emp3 = fun3.apply("hello world");//构造器一个参数,自动根据参数类别判断
System.out.println(emp3);
} /**
* 数组引用
*/
public static void test07() {
Function<Integer,String[]> fun = (x) -> new String[x];
String[] arr = fun.apply(10);
System.out.println(arr); System.out.println("----------");
Function<Integer,String[]> fun2 = String[]::new;//泛型中参数类型是Integer
String[] arr2 = fun2.apply(20); //构造器一个参数,自动根据参数类别判断
System.out.println(arr2);
} }
类的成员方法不能是静态的,而这个情况其实和静态方法类似,区别是,Lambda表达式的参数个数需要等于所调用方法的入参个数加一。
为什么要加一?
因为类的成员方法不能通过类名直接调用,只能通过对象来调用,也就是Lambda表达式的第一个参数,是方法的调用者,从第二个开始的参数个数要和需要调用方法的入参个数一致即可。如下图所示:

对于上面的例子,如果要对List中的每个对象执行一次它的repair方法:
cars.forEach(c -> c.repair());
根据上图,这里参数只有一个,而repair方法没有入参,所以不存在歧义,即可以改写为对应的方法引用:
cars.forEach(Car::repair);
Java笔记——Java8特性之Lambda、方法引用和Streams
JDK8新特性04 方法引用与构造器引用的更多相关文章
- JDK8新特性之方法引用
什么是方法引用 方法引用是只需要使用方法的名字,而具体调用交给函数式接口,需要和Lambda表达式配合使用. 如: List<String> list = Arrays.asList(&q ...
- JDK8新特性,方法的引用
引用方法并运行 在Java中,方法和构造方法都看作是对象的一种,那么你要引用它(不是调用),则可以用::来引用.用来存储这个引用的类型用@FunctionlaInterface注解来标识. 示例: p ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
- 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)
面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...
- JDK8 新特性
JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 ...
- JDK8新特性一览
转载自:http://blog.csdn.net/qiubabin/article/details/70256683 官方新特性说明地址 Jdk8新特性.png 下面对几个常用的特性做下重点说明. 一 ...
- JDK8新特性:使用stream、Comparator和Method Reference实现集合的优雅排序
大家对java接口Comparator和Comparable都不陌生,JDK8里面Comparable还和以前一样,没有什么改动:但是Comparator在之前基础上增加了很多static和defau ...
- jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;
jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ...
随机推荐
- [luogu5004]专心OI - 跳房子【矩阵加速+动态规划】
传送门:https://www.luogu.org/problemnew/show/P5004 分析 动态规划转移方程是这样的\(f[i]=\sum^{i-m-1}_{j=0}f[j]\). 那么很明 ...
- php 写斐波那契数列
<?php $arr = []; for($i=1;$i<9;$i++){ if($i==1 || $i ==2){ $arr[$i-1] = 1; }else{ $arr[$i-1] = ...
- ACM-ICPC 2015 BeiJing
比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G 然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...
- DHU--1247 Hat’s Words && HiHocder--1014 Trie树 (字典树模版题)
题目链接 DHU--1247 Hat’s Words HiHocder--1014 Trie树 两个一个递归方式一个非递归 HiHocoder #include<bits/stdc++.h> ...
- Java,mysql String与date类型转换
String 与 date类型转换 字符串转换成日期类型: SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");//小写 ...
- java ee wildfly 批处理 job 工作
配置批处理job,同时启动两个并行任务processData,syncTableTask,执行往后执行第三个任务job:playDurationTask. xml配置如下: <job id=&q ...
- js 获取对象属性个数
js 获取对象属性个数 方法一: var attributeCount = function(obj) { var count = 0; for(var i in obj) { if(obj.hasO ...
- Windows下使用Diskpart格式化U盘
步骤 进入Diskpartdiskpart 列出所有的磁盘list disk 选择磁盘select disk 清楚clean 创建主分区creat partition parimary 激活当前分区a ...
- echarts x轴文字显示不全解决办法
标题:echarts x轴文字显示不全(xAxis文字倾斜比较全面的3种做法值得推荐):http://blog.csdn.net/kebi007/article/details/68488694
- http请求415错误Unsupported Media Type
王子乔 每一个认真生活的人,都值得被认真对待 http请求415错误Unsupported Media Type 之前用了封装的ajax,因为请求出了点问题,我试了下jQuery的$.ajax,报出了 ...