首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java8——方法引用

Java8——方法引用

作者头像
Java旅途
发布2020-07-16 15:46:27
发布2020-07-16 15:46:27
6370
举报
文章被收录于专栏:Java旅途Java旅途

方法引用就是通过类名或方法名引用已经存在的方法来简化lambda表达式。那么什么时候需要用方法引用呢?如果lamdba体中的内容已经有方法实现了,我们就可以使用方法引用。

一、方法引用的三种语法格式

1. 对象::实例方法名

lamdba写法:

代码语言:javascript
复制
1@Test
2void test1(){
3    Consumer<String> con = x -> System.out.println(x);
4}

方法引用写法:

代码语言:javascript
复制
1@Test
2void test2(){
3    PrintStream out = System.out;
4    Consumer<String> con = out::println;
5}

consumer接口:

代码语言:javascript
复制
1@FunctionalInterface
2public interface Consumer<T> {
3    void accept(T t);
4}

注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

2. 类::静态方法名

lamdba写法:

代码语言:javascript
复制
1@Test
2void test3(){
3    Comparator<Integer> com = (x, y) -> Integer.compare(x,y);
4}

方法引用写法:

代码语言:javascript
复制
1@Test
2void test4(){
3    Comparator<Integer> com = Integer::compare;
4}

Comparator接口:

代码语言:javascript
复制
1@FunctionalInterface
2public interface Comparator<T> {
3    int compare(T o1, T o2);
4}

Integer类部分内容:

代码语言:javascript
复制
1public final class Integer extends Number implements Comparable<Integer> { 
2    public static int compare(int x, int y) {
3        return (x < y) ? -1 : ((x == y) ? 0 : 1);
4    }
5}

注意:被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致。

3. 类::实例方法名

lamdba写法:

代码语言:javascript
复制
1@Test
2void test5(){
3
4    BiPredicate<String,String> bp = (x,y) -> x.equals(y);
5}

方法引用写法:

代码语言:javascript
复制
1@Test
2void test6(){
3    BiPredicate<String,String> bp = String::equals;
4}

BiPredicate接口:

代码语言:javascript
复制
1@FunctionalInterface
2public interface BiPredicate<T, U> {
3    boolean test(T t, U u);
4}

注意:第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数时,就可以使用这种语法。

二、构造器引用

类::new

lamdba写法:

代码语言:javascript
复制
1@Test
2void test7(){
3    Supplier<Person> supplier = ()->new Person();
4}

构造器应用写法:

代码语言:javascript
复制
1@Test
2void test8(){
3    Supplier<Person> supplier = Person::new;
4}

Supplier接口:

代码语言:javascript
复制
1@FunctionalInterface
2public interface Supplier<T> {
3    T get();
4}

Person类:

代码语言:javascript
复制
 1@Data
 2public class Person implements Serializable {
 3    private static final long serialVersionUID = -7008474395345458049L;
 4
 5    private String name;
 6    private int age;
 7
 8    public Person() {
 9    }
10    public Person(String name, int age) {
11        this.name = name;
12        this.age = age;
13    }
14}

注意:person类中有两个构造器,要调用哪个构造器是函数式接口决定的,也就是Supplier接口中的get()方法是无参的,那么就调用的是person中的无参构造器。

三、数组引用

Type::new

lamdba写法:

代码语言:javascript
复制
1@Test
2void test9(){
3    Function<Integer,String[]> fun = x -> new String[x];
4}

数组引用写法:

代码语言:javascript
复制
1@Test
2void test10(){
3    Function<Integer, String[]> fun = String[]::new;
4}

Function接口部分内容:

代码语言:javascript
复制
1@FunctionalInterface
2public interface Function<T, R> {
3    R apply(T t);
4}

总结

  • 方法应用及构造器引用其实可以理解为lamdba的另一种表现形式
  • 方法引用被调用的方法的参数列表和返回值类型需要与函数式接口中抽象方法的参数列表和返回值类型要一致
  • 方法引用中使用类::实例方法的条件是第一个参数是这个实例方法的调用者,第二个参数是这个实例方法的参数
  • 构造器引用需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表一致

< END >

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 一、方法引用的三种语法格式
    • 1. 对象::实例方法名
    • 2. 类::静态方法名
    • 3. 类::实例方法名
  • 二、构造器引用
    • 类::new
  • 三、数组引用
    • Type::new
  • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档