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 ...
随机推荐
- Codeforces Round #554 ( div.2 ) 总结
应该经常需要锻炼一下英语阅读理解能力和代码能力,所以以后还是需要多打打CF. 今天大概就是水一水找找感觉. A. Neko Finds Grapes $n$个箱子,$m$个钥匙 ($n,m \leq ...
- Arukas.io云主机安装CentOS
创建应用 1 jdeathe/centos-ssh:centos-6 启动应用 电机启动应用,应用会自动部署,等显示Running 就说明成功了.估计需要几分钟. 查看用户以及密码 自己保存下用户 ...
- http_proxy_module模块常用参数
Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器. http_proxy_module模块常用参数: p ...
- poj-3279 poj-1753(二进制枚举)
题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...
- jquery $().each,$.each的区别
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法. 两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. 一,$().each $().ea ...
- C# Winform ListView控件
一.ListView: 1.视图改为为Detalis: 2.编辑列,每添加一个添加一列,右侧属性Text改列名,停靠位置,列头的长度等等: 3.右侧属性,点开Iteme,添加ListViewItem集 ...
- BZOJ3881 Divljak
解:对被包含的那些串建AC自动机. 每次加一个串,就在AC自动机上面跑,可知能够跑到一些节点. 这些节点都是一些前缀的形式,我们跳fail树就是跳后缀,这样就能够得到所有能匹配的子串. 我们分别对AC ...
- python描述器
描述器定义 python中,一个类实现了__get__,__set__,__delete__,三个方法中的任何一个方法就是描述器,仅实现__get__方法就是非数据描述器,同时实现__get__,__ ...
- react-native中的TextInput
TextInput是一个允许用户输入文本的基础组件.它有一个名为onChangeText的属性,此属性接受一个函数, 而此函数会在文本变化时被调用.另外还有一个名为onSubmitEditing的属性 ...
- Summary of Java basics review data
1.标识符 用于命名程序的对象,如方法名,变量名,规则是: a.大小写敏感 b.由英文字符,文字字符,美元符号,下划线和数字组成,但不能以数字开头 c.不能是关键字 2.%:求余运算符 ...