java8 新特性之方法引用简介说明

Java-教程王 Java教程 发布时间:2021-08-25 22:29:59 阅读数:17870 1

一、方法引用的简介

方法引用是java8的新特性之一
可以直接引用已有Java类或对象的方法或构造器
当方法引用同Lambda表达式一起使用时,可使代码更加简洁
例:

public static void main(String[] args) {
        list<String> strList = Arrays.asList(new String[] { "j", "a", "v","a" });

        strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
}
/*字符串遍历排序并打印
可修改为方法引用的样式,如下所示:
*/

public static void main(String[] args) {
    List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });
    strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println);
}
从以上改进的代码中,我们可以看出,
采用方法引用的方式可简化lambda表达式的写法

二、方法引用常用的写法

java8方法引用有四种形式:
    静态方法引用       :   ClassName :: staticMethodName 构造器引用        :   ClassName :: new 类的任意对象的实例方法引用:   ClassName :: instanceMethodName 特定对象的实例方法引用  :   object :: instanceMethodName
lambda表达式之方法引用的场景
     1.lambda表达式中只包含一个表达式,且这个表达式调用一个已存在的方法
     2.方法引用的入参和返回值需同lambda表达式的函数入参和返回值一致

静态方法引用

   
  静态方法引用的语法格式为:
     类名::静态方法名 ,如
  
    System.out::println 等同于
     lambda表达式 s -> System.out.println(s) 
例:
public class TestMain
{
    public static void main(String[] args)
    {
        //lambda表达式使用:
        Arrays.asList(new String[] {"j", "a", "v","a"}).stream().forEach(s -> Test.println(s));
        //静态方法引用:
        Arrays.asList(new String[] {"j", "a", "v","a"}).stream().forEach(Test::println);
    }
    
    public static void println(String s)
    {
        System.out.println(s);
    }
}

构造器引用

    构造器引用的语法格式为: 类名::new ,如() -> new ArrayList<String>() 等价于 ArrayList<String>::new,
例:
Che<List<String>> che1= () -> new  ArrayList<String>();
等价于
Che<List<String>> che = ArrayList<String>::new;
构造器引用适用于lambda表达式主体中
只调用了某个类的构造函数返回实例的场景

类的任意对象的实例方法引用

    类的任意对象的实例方法引用的语法格式为: 类名::实例方法名 , 这种方法引用相对比较复杂,我们来看示例:
例:
  Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2)); 
  --------其效果等同于------------
  Arrays.sort(strs, String::compareToIgnoreCase);
例:
public class Student
{
    private String name;    
    private Integer score;
    public void setNameAndScore(String name, Integer score)
    {
        this.name = name;
        this.score = score;
        System.out.println("Student "+  name +"'s score is " + score);
    }
     
    public static void main(String[] args)
    {
        /*lambda表达式的用法:
        TestInterface testInterface = (student, name, score) -> student.setNameAndScore(name, score);*/
        //类的任意对象的实例方法引用的用法:
        TestInterface testInterface = Student::setNameAndScore;
        testInterface.set(new Student(), "DoubleBin", 100);
    }
    
    @FunctionalInterface
    interface TestInterface
    {
        // 注意:入参比Student类的setNameAndScore方法多1个Student对象,除第一个外其它入参类型一致
        public void set(Student d, String name, Integer score);
    }
}
 
方法引用的特性
   1.方法引用的通用特性:方法引用所使用方法的入参和返回值与lambda表达式实现的函数式接口的入参和返回值一致;
   2.lambda表达式的第一个入参为实例方法的调用者,后面的入参与实例方法的入参一致
 

方法引用总结

方法引用使用运算符::连接类(或对象)方法名称(或new)实现在特定场景下lambda表达式的简化表示
使用时要注意方法引用的使用场景及各种方法引用的特性
使用方法引用的优点使代码更简洁
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202108/864.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者