Jdk1.8新特性(三)——方法引用::

25 篇文章 2 订阅

Lambda表达式可以用来创建匿名方法,有时候使用lambda表达式仅仅是调用一个已存在的方法:

Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));

在java8中,可以直接通过方法引用的来简写lambda表达式中已经存在的方法:

Arrays.sort(stringsArray,String::compareToIgnoreCase);

这种特性就是方法引用。

方法引用是一种更简洁易懂的lambda表达式,操作符是双冒号::,被用来直接访问类或者实例已经存在的方法或构造方法。方法引用提供了一种引用而不执行的方式,它需要由兼容的函数式接口构成的目标上下文。计算时,方法引用会创建函数式接口的一个实例。

在Java 8中,我们会使用Lambda表达式创建匿名方法,但是有时候,我们的Lambda表达式可能仅仅调用一个已存在的方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰,Java 8的方法引用也允许我们这样做。

示例:

定义一个Person实体类
在这里插入图片描述
实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列

  • 使用Arrays的sort方法:
    public static void sort(T[] a, Comparator<? super T> c)
package com.example.jdknewuse;

import org.junit.Test;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Comparator;
import static org.junit.Assert.*;

/**
 * 实现:已知一个person数组,通过生日进行排序,排序规则为:按照年龄从大到小排列
 * 使用Arrays的sort方法:
 * public static <T> void sort(T[] a, Comparator<? super T> c)
 * Created by liumengbing on 2019/02/19 10:02.
 */
public class PersonTest {

    @Test
    public void personTest() throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Person[] personArray = new Person[]{
                new Person(sdf.parse("20050901"),"tom"),
                new Person(sdf.parse("20010901"),"mary"),
                new Person(sdf.parse("20060901"),"jack"),
                new Person(sdf.parse("20020901"),"nick"),
                new Person(sdf.parse("20040901"),"sarah")
        };

        //方法一:使用匿名内部类
        Arrays.sort(personArray, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getBirthday().compareTo(o2.getBirthday());
            }
        });
        System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]


        //方法二:因为Comparator接口是一个函数式接口,所以我们可以使用lambda表达式(未调用已存在的方法)
        Arrays.sort(personArray,(o1,o2)->{
            return o1.getBirthday().compareTo(o2.getBirthday());
        });
        System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]


        //方法三:使用lambda表达式(使用已存在的compareByAge方法)
        Arrays.sort(personArray,(o1,o2)->Person.compareByAge(o1,o2));
        System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]


        //方法四:因为这个Lambda表达式调用了一个已存在的方法,因此,我们可以直接使用方法引用来替代这个Lambda表达式
        Arrays.sort(personArray,Person::compareByAge);
        System.out.print(Arrays.asList(personArray));//[mary, nick, sarah, tom, jack]   
    }
}

注意:方法引用Person::compareByAge在语义上与lambda表达式(o1,o2)->Person.compareByAge(o1,o2)是等同的。

总结:

方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)有以下四种形式的方法引用:

在这里插入图片描述
四种形式方法引用的具体用法示例请参看以下资料:
Java8之方法引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值