Lambda 方法引用
1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式)
方法引用主要有三种语法格式:
① 对象 :: 实例方法名
② 类 :: 静态方法名
③ 类 :: 实例方法名
实例说明
//对象 :: 实例方法名
@Test
public void test1(){
//Lambda表达式
Consumer<String> con = (x) -> System.out.println(x);
con.accept("hello Lambda"); //方法引用
PrintStream ps = System.out;
Consumer<String> con1 = ps :: println;
con1.accept("hello Lambda1"); //简化一步为
Consumer<String> con2 = System.out :: println;
con1.accept("hello Lambda2");
} //对象 :: 实例方法名
@Test
public void test2() {
Employee emp = new Employee("张三", 18, 8888.88); //Lambda
Supplier<String> sup = () -> emp.getName();
String str = sup.get();
System.out.println(str); //方法引用
Supplier<Integer> sup2 = emp :: getAge;
int age = sup2.get();
System.out.println(age); } //类 :: 静态方法名
@Test
public void test3(){ //Lambda
Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
int res = com.compare(2, 0);
System.out.println(res); //方法引用
Comparator<Integer> com2 = Integer :: compare;
int res2 = com2.compare(1, 3);
System.out.println(res2);
} //类 :: 实例方法名
@Test
public void test4(){ //Lambda
BiPredicate<String, String> bp = (x, y) -> x.equals(y);
boolean flag = bp.test("hello", "hello");
System.out.println(flag); //方法引用
BiPredicate<String, String> bp2 = String :: equals;
boolean flag2 = bp2.test("hello", "world");
System.out.println(flag2);
}
注意:
① Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口抽象方法的函数列表和返回值类型保持一致!
② Lambda 参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName :: Method
2.构造器引用
构造器引用语法格式:
ClassName :: new
实例说明
//构造器引用 ClassName :: new
@Test
public void test5(){
//Lambda 无参数构造方法
Supplier<Employee> sup = () -> new Employee();
Employee employee = sup.get(); //构造器引用
Supplier<Employee> sup2 = Employee :: new;
Employee employee2 = sup2.get(); //有一个参数构造方法
Function<String, Employee> fun = (x) -> new Employee(x);
Employee emp1 = fun.apply("张三"); Function<String, Employee> fun2 = Employee :: new;
Employee emp2 = fun2.apply("张三"); //两个参数的构造方法
BiFunction<String, Integer, Employee> bf = (x, y) -> new Employee(x, y);
Employee emp3 = bf.apply("李四", 18); BiFunction<String, Integer, Employee> bf2 = Employee :: new;
Employee emp4 = bf.apply("李四", 18);
System.out.println(emp4.getName());
}
注意:需要调用的构造器的参数列表要与函数式接口中的抽象方法的参数列表保持一致!
3.数组引用
数组引用语法格式:
Type[] :: new;
实例说明
//数组引用 Type[] :: new;
@Test
public void test6() {
Function<Integer, String[]> fu = (x) -> new String[x];
String[] strs = fu.apply(10);
System.out.println(strs.length); Function<Integer, String[]> fu2 = String[] :: new;
String[] strs2 = fu2.apply(8);
System.out.println(strs2.length);
}
Employee类
public class Employee {
private String name;
private int age;
private double salary;
public Employee() {
}
public Employee(String name) {
this.name = name;
}
public Employee(String name, int age) {
this.name = name;
this.age = age;
}
public Employee(String name, int age, double salary) {
super();
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
Lambda 方法引用的更多相关文章
- JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用
一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...
- java8 lambda方法引用
注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...
- Java自学-Lambda 方法引用
Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: public static boolean testHero(Hero h) { return h.h ...
- Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法
本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...
- Java8新特性 -- Lambda 方法引用和构造器引用
一. 方法引用: 若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用” 要求 方法的参数和返回值类型 和 函数式接口中的参数类型和返回值类型保持一致. 主要有三种语法格式: 对象 :: ...
- 第九章 Lambda&方法引用
9.1.Lambda表达式 9.1.1.标准格式 (形式参数) -> {代码块} 9.1.2.使用前提 有一个接口并且接口中有且仅有一个抽象方法 9.1.3.常见应用 9.1.3.1.无参无返回 ...
- Lambda 方法引用 构造器引用 数组引用
一.方法引用 注意: 1.Lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值保持一致!2.若Lambda 参数列表中的第一个参数是实例方法的调用者,而第二个 ...
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- Java8特性之Lambda、方法引用和Streams
这里涉及三个重要特性: Lambda 方法引用 Streams ① Lambda 最早了解Lambda是在C#中,而从Java8开始,Lambda也成为了新的特性,而这个新的特性的目的,就是为了消除单 ...
随机推荐
- python语法基础-面向对象-基础-长期维护
############### 类的基本操作 ############## """ 类的基本认识: 1,类就是一个模子 2,dict,list都是类,具体的一 ...
- Users组权限Win7虚拟机继承Administrator的个性化设置
在administrator账号下进行的模板设置,配置文件保存在“C:\Documents and Settings\Administrator”文件夹下的profile里面,但是创建的用户虚拟机获取 ...
- 牛客-小y的盒子
题目传送门 -------------------稍加观察就会发现,4n - 1就是题目要的答案.至于为什么,看官方的题解.不过这个n非常的大,用正常快速幂解决不了.这道题我学到的就是解决幂非常大的情 ...
- Qt 信号阻塞和断开
Qt程序中有时候不希望信号槽的触发,在某段流程结束之后,又需要继续回复信号槽状态,这时候可以用阻塞或者断开信号槽的方法来处理. 1. 阻塞方法:bool QObject::blockSignals(b ...
- Zabbix调用外部脚本发送邮件:python编写脚本
Zabbix调用外部脚本发送邮件的时候,会在命令行传入两个参数,第一个参数就是要发送给哪个邮箱地址,第二个参数就是邮件信息,为了保证可以传入多个参数,所以假设有多个参数传入 #!/usr/bin/en ...
- zabbix配置文件详解--服务(server)端、客户(agent)端、代理(proxy)端
在zabbix服务(server)端.客户(agent)端.代理(proxy)端分别对应着一个配置文件,即:zabbix_server.conf,zabbix_agentd.conf,zabbix_p ...
- Thymeleaf模板笔记
1.常用标签: 使用thymeleaf模板,首要在html中引入: <html xmlns:th="http://www.thymeleaf.org"> 引入css.j ...
- mabatis中的元素属性
resultMap属性id 唯一标识type 返回类型extends 继承别的resultMap,可选关联其他标签id 设置主键使用,使用此标签配置映射关系(可能不止一个)result 一般属性的配置 ...
- 垃圾回收GC
每种语言都有自己的垃圾回收机制.接下来我们来讲一下python的垃圾回收机制. 小整数对象池:python对小整数的定义为[-5,257),这些整数对象是提前建立好的,不会被垃圾回收.单个字母也一 ...
- Python时间操作所相关
相关模块:time,datetime,calendar(日历模块) 获取当前时间: # 获取当前10位时间戳,默认返回为float类型 print int(time.time()) # output: ...