Java新特性--方法引用
常见方法引用
方法引用可以让你重复使用现有的方法定义,并像Lambda一样传递它们。
方法引用可以看做是仅仅调用特定方法的Lambda表达式的一种便捷写法。类似于Lambda表达式,方法引用不能独立存在,总是会转换为函数式接口的实例。
需要使用方法引用时,用::操作符分隔对象(或类名)和方法名,目标引用放在分隔符::前面,方法名放在::后面。
注意,只需要方法名,不需要小括号。
主要有三种情况:
对象::实例方法
Class::静态方法
Class::实例方法
指向静态方法的方法引用
Lambda表达式:(args) -> ClassName.staticMethod(args)
方法引用:ClassName::staticMethod
实例一:
@Test
public void test02(){
Comparator<Integer> com1 = (x, y) -> Integer.compare(x, y);
System.out.println(com1.compare(1, 2)); Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(2, 1));
}
示例二:
Integer[] data = {21,90,34,76};
Arrays.sort(data, Integer::compare);//引用静态方法
System.out.println(Arrays.toString(data));
其中Arrays.sort方法解释
static <T> void sort(T[] a, Comparator<? super T> c)
根据指定的比较器引发的顺序对指定的对象数组进行排序。
指向任意类型的实例方法的引用
Lambda表达式:
(args0, args1) -> args0.instanceMethod(args1)
args0是ClassName类型的一个对象
方法引用:ClassName::instanceMethod
Lambda 参数列表中的第一个参数是方法的调用者,第二个参数是方法的参数时(或不存在时,例如调用JavaBean的get()方法),才能使用 ClassName :: Method
示例一:
@Test
public void test03(){
BiPredicate<String, String> bp1 = (x, y) -> x.equals(y);
System.out.println(bp1.test("a","b")); BiPredicate<String, String> bp2 = String::equals;
System.out.println(bp2.test("c","c"));
}
其中Predicate的test方法解释
boolean test(T t, U u)
根据给定的参数来评估这个谓词。
实例二:
List<String> list = Arrays.asList("ccc", "bbb", "aaa");
list.sort(String::compareTo);//引用实例方法
System.out.println(list);
其中list.sort方法解释:
default void sort(Comparator<? super E> c)
使用随附的 Comparator排序此列表来比较元素。
指向现有对象的实例方法的引用
Lambda表达式:(args) -> obj.instanceMethod(args)
方法引用:obj::instanceMethod
示例一:
@Test
public void test01(){
PrintStream ps = System.out;
Consumer<String> con1 = (s) -> ps.println(s);
con1.accept("aaa"); Consumer<String> con2 = ps::println;
con2.accept("bbb");
}
示例二:
list.forEach(System.out::println);
构造方法引用
对于一个现有的构造方法,可以使用类名和关键字new来创建一个构造方法的引用:ClassName::new
package com.wangbo.cto.lambda; import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier; /**
* @date 2019/11/14 23:08
* @auther wangbo
*/
public class Test1 {
public static void main(String[] args) { //引用无参数构造方法
Supplier<Person> supplier = Person::new;
Person p1 = supplier.get();
System.out.println(p1); //引用有一个参数构造方法
Function<String, Person> function = Person::new;
Person p2 = function.apply("wangbo");
System.out.println(p2); //应用有两个参数的构造方法
BiFunction<String, Integer, Person> biFunction = Person::new;
Person p3 = biFunction.apply("wangbo", 28);
System.out.println(p3); //如果引用有三个参数及三个以上参数的构造方法,需要自定义匹配的函数式接口
TriFunction<String, Integer, String, Person> triFunction = Person::new;
Person p4 = triFunction.myMethod("zhangsan", 90, "男");
System.out.println(p4);
}
}
/**
* 自定义函数式接口
*/
@FunctionalInterface
public interface TriFunction<T, U, V, R>{
R myMethod(T t, U u, V v);
}
public class Person{
String name;
Integer age;
String gender;
public Person(){}
public Person(String name) {
this.name = name;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person(String name, Integer age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name=" + name +
", age=" + age +
", gender="+ gender +
"}";
}
}
运行结果
Person{name=null, age=null, gender=null}
Person{name=wangbo, age=null, gender=null}
Person{name=wangbo, age=28, gender=null}
Person{name=zhangsan, age=90, gender=男}
Java新特性--方法引用的更多相关文章
- JAVA8新特性——方法引用
JAVA9都要出来了,JAVA8新特性都没搞清楚,是不是有点掉队哦~ 在Lamda新特性的支持下,JAVA8中可以使用lamda表达式来创建匿名方法.然而,有时候我们仅仅是需要调用一个已存在的方法(如 ...
- Java 8 特性 —— 方法引用
方法引用通过方法的名字来指向一个方法.方法引用可以使语言的构造更紧凑简洁,减少冗余代码.方法引用使用一对冒号 :: .下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不 ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
- java8新特性-方法引用
方法引用:若 Lambda 体中的功能,已经有方法提供了实现,可以使用方法引用 (可以将方法引用理解为 Lambda 表达式的另外一种表现形式) 1. 对象的引用 :: 实例方法名2. 类名 :: 静 ...
- Java8 新特性 方法引用
什么是方法引用 方法引用可以被看作仅仅调用特定方法的Lamdba表达式的一种快捷方式.比如说Lamdba代表的只是直接调用这个方法,最好还是用名称来调用它,可不用用对象.方法名(),方法引用,引用 ...
- Java8新特性 - 方法引用与构造器引用
方法引用 若Lambda体中的内容有方法已经实现了,我们可以使用"方法应用",可以理解为方法引用是Lambda表达式的另外一种表现形式. 使用操作符"::"将方 ...
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
新语法 方法引用Method references Lambda语法 Lambda语法在AndroidStudio中报错 Stream API 我正参加2016CSDN博客之星的比赛 希望您能投下宝贵 ...
- Hi java新特性
java新特性 1995.5.23 java语言 1996 jdk1.0 250个类在API 主要用在桌面型应用程序1997 jdk1.1 500 图形用户界面编程1998 jdk1.2 2300 J ...
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- 主流的单元测试工具之-JAVA新特性-Annotation
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
随机推荐
- 【转载】 推荐算法之Thompson(汤普森)采样
原文地址: https://www.cnblogs.com/gczr/p/11220187.html ------------------------------------------------- ...
- 安装python库roboschool运行报错:ImportError: libpcre16.so.3: cannot open shared object file——解决方法
如题: 运行roboschool运行报错. 操作系统: Ubuntu ImportError: libpcre16.so.3: cannot open shared object file: No s ...
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(8) —— 2021年9月SOTA的TDL算法——《Optimistic Temporal Difference Learning for 2048》——完结篇
<2048>游戏在线试玩地址: https://play2048.co/ 如何解决<2048>游戏源于外网的一个讨论帖子,而这个帖子则是讨论如何解决该游戏的最早开始,可谓是&q ...
- Python 环境傻瓜式搭建 :Anaconda概述
Anaconda概述 Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存.切 ...
- br4gOnB4ll靶机笔记
br4gOnB4ll靶机笔记 这是一台vulnhub上的免费靶机,比较简单. 1.主机发现 主机发现 -sn 只做ping扫描,不做端口扫描 nmap -sn 192.168.84.1/24 Star ...
- Linux驱动|cdev_init、cdev_alloc区别
这两个函数是字符设备初始化相关的内核函数. 要想了解这两个函数,必须要知道字符设备的架构,以及字符设备创建的流程. 关于字符设备可以参考下面这篇文章 <手把手教Linux驱动3-之字符设备架构详 ...
- DDD建模后写代码的正确姿势(Java、dotnet双平台)
本文书接上回<一种很变态但有效的DDD建模沟通方式>,关注公众号(老肖想当外语大佬)获取信息: 最新文章更新: DDD框架源码(.NET.Java双平台): 加群畅聊,建模分析.技术交流: ...
- MySQL数据库基本操作以及使用
MySQL数据库 操纵数据库 查看数据库 show databases; 创建数据库 create database <database_name>; 删除数据库 drop databas ...
- 【Python自动化】之特殊的自动化定位操作
今天有时间了,想好好的把之前遇到过的自动化问题总结一下,以后有新的总结再更新 目录: 一.上传文件(4.11) 二.下拉框选择(4.11) 1.Select下拉框 2.非Select下拉框 三.下拉框 ...
- DPABInet做 Network Contruction时一直报错“函数或变量 'nets_netmats' 无法识别”
DPABInet模块做 Network Contruction时一直显示报错"函数或变量 'nets_netmats' 无法识别",是因为没有将FSLNets导入路径,所以找不到该 ...