Java8——方法引用
方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。
一、方法引用的三种语法格式
1. 对象::实例方法名
lamdba写法:
@Test
void test1(){
Consumer<String> con = x -> System.out.println(x);
}
方法引用写法:
@Test
void test2(){
PrintStream out = System.out;
Consumer<String> con = out::println;
}
consumer接口:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。
2. 类::静态方法名
lamdba写法:
@Test
void test3(){
Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
}
方法引用写法:
@Test
void test4(){
Comparator<Integer> com = Integer::compare;
}
Comparator接口:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
Integer类部分内容:
public final class Integer extends Number implements Comparable<Integer> {
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
}
注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。
3. 类::实例方法名
lamdba写法:
@Test
void test5(){
BiPredicate<String,String> bp = (x,y) -> x.equals(y);
}
方法引用写法:
@Test
void test6(){
BiPredicate<String,String> bp = String::equals;
}
BiPredicate接口:
@FunctionalInterface
public interface BiPredicate<T, U> {
boolean test(T t, U u);
}
注意:第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数时,就可以使用这种语法。
二、构造器引用
类::new
lamdba写法:
@Test
void test7(){
Supplier<Person> supplier = ()->new Person();
}
构造器应用写法:
@Test
void test8(){
Supplier<Person> supplier = Person::new;
}
Supplier接口:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Person类:
@Data
public class Person implements Serializable {
private static final long serialVersionUID = -7008474395345458049L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
注意:person类中有两个构造器,要调用哪个构造器是函数式接口决定的,也就是Supplier接口中的get()方法是无参的,那么就调用的是person中的无参构造器。
三、数组引用
Type::new
lamdba写法:
@Test
void test9(){
Function<Integer,String[]> fun = x -> new String[x];
}
数组引用写法:
@Test
void test10(){
Function<Integer, String[]> fun = String[]::new;
}
Function接口部分内容:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
总结
- 方法应用及构造器引用其实可以理解为lamdba的另一种表现形式
- 方法引用被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致
- 方法引用中使用类::实例方法的条件是第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数
- 构造器引用需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致
Java8——方法引用的更多相关文章
- Java8 方法引用
概述 方法引用是用来直接访问类或实例阴茎存在的方法或者构造方法.它需要由兼容的函数式接口(lambda表达式中用到的接口)构成的目标类型上下文. 有时候, 当我们想要实现一个函数式接口的方法, 但是已 ...
- Java8 方法引用和构造方法引用
如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...
- JAVA8方法引用
方法引用:若Lambda方法体已经实现,我们可以使用方法引用* 主要有三种语法格式:* 对象::实例方法名* 类::实例方法名* 类::静态方法名** 注意:Lambda体中调用的方法的参数列表与返回 ...
- Java8 方法引用与构造器引用,数组引用
package java_8; import org.junit.Test; import java.io.PrintStream; import java.util.Comparator; impo ...
- java8 方法引用与lambda
List<String> list = new ArrayList<>(); //list.stream().filter((String s)->System.out. ...
- Java 方法引用_特性
JAVA8 方法引用:(四种方法引用的使用) 对象引用的特点:不同的对象可以操作同一块的内容:而方法引用就是指为一个方法设置别名,相当于一个方法定义了不同的名字. 引用静态方法: 类名称 :: sta ...
- Java笔记——Java8特性之Lambda、方法引用和Streams
Java8已经推出了好一段时间了,而掌握Java8的新特性也是必要的,如果要进行Spring开发,那么可以发现Spring的官网已经全部使用Java8来编写示例代码了,所以,不学就看不懂. 这里涉及三 ...
- 30分钟入门Java8之方法引用
30分钟入门Java8之方法引用 前言 之前两篇文章分别介绍了Java8的lambda表达式和默认方法和静态接口方法.今天我们继续学习Java8的新语言特性--方法引用(Method Referenc ...
- Java8新特性之二:方法引用
上一节介绍了Java8新特性中的Lambda表达式,本小节继续讲解Java8的新特性之二:方法引用.方法引用其实也离不开Lambda表达式. 1.方法引用的使用场景 我们用Lambda表达式来实现匿名 ...
随机推荐
- (五)application/x-www-form-urlencoded(表单请求)
原文链接:https://blog.csdn.net/justry_deng/article/details/81042379
- 【JMeter_07】JMeter逻辑控制器__循环控制器<Loop Controller>
循环控制器<Loop Controller> 业务逻辑: 根据所填写的循环次数,对当前节点下的取样器进行响应次数的循环请求,这里可以填写变量.整数.小数.字母.负数.各种符号等: 当填写整 ...
- vue事件修饰符与按钮修饰符
事件修饰符:(当事件无需传参数时可直接写成以下形式,有参数时则为@click.stop="handleLiClick($event)") stop:阻止事件冒泡行为(子元素被点击, ...
- 深入理解Java虚拟机学习笔记(一)-----Java内存区域
一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...
- 【漏洞二】Apache HTTP Server "httpOnly" Cookie信息泄露漏洞
[漏洞] Apache HTTP Server "httpOnly" Cookie信息泄露漏洞 [原因] 服务器问题 Apache HTTP Server在对状态代码400的默认错 ...
- 删库吧,Bug浪——我们在同一家摸鱼的公司
那些口口声声, Bug越来越难写人的,应该盯着你们: 像我一样,我盯着你们,满眼恨意. IT积攒了几十年的漏洞, 所有的死机.溢出.404和超时, 像是专门为你们准备的礼物. 圈复杂度.魔鬼变量.内存 ...
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2的最佳处理方法,亲测可用
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2 ...
- python_Linux系统的常用命令(三)
用户权限常用命令 1.用户和权限 r--读--4, w--写--2, x--执行--1 chmod 可以修改用户/组对文件/目录的权限 格式:chmod +/-rwx 文件名/目录名 su -用户:切 ...
- JS的一些知识点
1.介绍一下js的数据类型有哪些,值是如何存储的 JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined.Null.Boolean.Number.String.Symbol ...
- (一)ansible 安装配置
CentOS 7.5 一,安装 yum -y install ansible 二,配置hosts文件 /etc/ansible/hosts s1 ansible_ssh_port= ansible_s ...