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的一 ...
随机推荐
- 在vscode中通过修改launch.json文件为项目添加环境变量——在launch.json文件中修改env变量
在vscode中launch.json文件具有十分重要的作用,在vscode中可以通过修改launch.json文件修改调试和运行代码时的设置. 本文假设已对vscode有初步了解,已可以创建laun ...
- SemanticKernel/C#:实现接口,接入本地嵌入模型
前言 本文通过Codeblaze.SemanticKernel这个项目,学习如何实现ITextEmbeddingGenerationService接口,接入本地嵌入模型. 项目地址:https://g ...
- Java和LWJGL的关于OpenAL的文章
一.OpenAL的原理和基本概念: 1.1 OpenAL的架构 OpenAL的架构同样基于三个核心组件:Context(上下文).Source(声源)和Buffer(缓冲区).Context代表了音频 ...
- 使用BizyAir,没有显卡,也能玩AI绘图
或许很多人跟我一样,没有显卡,但又很想玩AI绘图,但本地绘图怕是无缘了,只能借助云GPU的方式了. 今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图. 方案就是ComfyUI+ ...
- 存储过程中调用EXECUTE IMMEDIATE的“权限不足”
EXECUTE IMMEDIATE是Oracle中使用动态SQL的一种方法,可以直接执行,也可以在存储过程中调用.然而在存储过程中调用可能会遇到权限不足的问题,如在存储过程中执行重建索引语句: sql ...
- 安装部署harbor
配置文件中修改内容hostname 和 证书 私钥 需要指定到文件 hostname: hub.rainsc.com # http related config http: # port for ht ...
- Zsh 配置
基本配置 安裝 Zsh: # Ubuntu/Debian sudo apt install zsh # macOS brew install zsh macOS 默认使用 Zsh,可以不用重复安装. ...
- 啥是Session?
什么是 Session 会话? 1.Session 就一个接口(HttpSession). 2.Session 就是会话.它是用来维护一个客户端和服务器之间关联的一种技术. 3.每个客户端都有自己的一 ...
- UDT(一):概览
1. 参考链接 官网 https://udt.sourceforge.io/ 谷博士对UDT的简单介绍 https://udt.sourceforge.io/doc/udt-2009.ppt 获取UD ...
- Wordpress 建立公司网站
1. 先安装好wordpress wordpress 6.4.2-php8.1-fpm-alpine php8.1 Login to wordpress http://www.hei-ya.com/w ...