美文网首页
方法引用

方法引用

作者: 一只弱狗 | 来源:发表于2019-10-25 13:36 被阅读0次

    方法引用(Method References)

    声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!!

    方法引用

    方法引用通过方法的名字来指向一个方法。

    方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

    方法引用使用一对冒号 ::

    当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!

    方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。

    要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!

    格式:使用操作符 “::” 将类(或对象) 与 方法名分隔开来。

    如下三种主要使用情况:

    • 对象:: 实例方法名

    • 类 :: 静态方法名

    • 类:: 实例方法

    示例:

    // 例如:消费型接口
    Consumer<String> consumer = (x)-> System.out.println(x);
    // 等价于
    Consumer<String> consumer1 =System.out::println;
    // 例如:
    Comparator<Integer> comparator =(x,y)->Integer.compare(x,y);
    // 等价于
    Comparator<Integer> comparator1 =Integer::compare;
    // 例如:
    BiPredicate<String,String> biPredicate = (x,y)->x.equals(y);
    // 等价于
    BiPredicate<String,String> biPredicate1 = String::equals;
    

    注意: 当 函数式接口方法的第一个参数是需要引用方法的调用 者 ,并且第二数 个参数是需要引用方法的参数( 或无参数) 时:ClassName::methodName

    构造器引用

    格式: ClassName::new 或者更一般的ClassName< T >::new

    与函数式接口相结合,自动与函数式接口中方法兼容。

    可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致!且方法的返回值即为构造器对应类的对象。

    class MyClass{
        MyClass(Integer n){
        }
    }
    
    // 对类型为Integer的对象应用操作,并返回结果,结果是MyClass类型的对象。
    Function<Integer, MyClass> function = (n) -> new MyClass(n);
    // 等价于
    Function<Integer,MyClass> function1 =MyClass::new;
    

    数组引用

    格式: type[] :: new

    Function<Integer,Integer[]> function2 = (n)->new Integer[n];
    // 等价于
    Function<Integer,Integer[]> function3 =Integer[]::new;
    

    在 MethodReferencesTester.java 文件输入以下代码:

    package method.references;
    
    import java.util.Comparator;
    import java.util.function.BiPredicate;
    import java.util.function.Consumer;
    import java.util.function.Function;
    
    /**
     * <p>
     * description: 方法引用
     * </p>
     *
     * @author shensr
     * @version V1.0
     * @create 2019/10/25
     **/
    
    public class MethodReferencesTester {
        public static void main(String[] args) {
            // 例如:消费型接口
            Consumer<String> consumer = (x) -> System.out.println(x);
            // 等价于
            Consumer<String> consumer1 = System.out::println;
            // 例如:
            Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
            // 等价于
            Comparator<Integer> comparator1 = Integer::compare;
            // 例如:
            BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
            // 等价于
            BiPredicate<String, String> biPredicate1 = String::equals;
    
            // 对类型为Integer的对象应用操作,并返回结果,结果是MyClass类型的对象。
            Function<Integer, MyClass> function = (n) -> new MyClass(n);
            // 等价于
            Function<Integer,MyClass> function1 =MyClass::new;
    
            Function<Integer,Integer[]> function2 = (n)->new Integer[n];
            // 等价于
            Function<Integer,Integer[]> function3 =Integer[]::new;
    
        }
    
    }
    class MyClass{
    
        MyClass(Integer n){
            
        }
    }
    

    相关文章

      网友评论

          本文标题:方法引用

          本文链接:https://www.haomeiwen.com/subject/iqxsvctx.html