Java8方法引用(::)

Java 8 中的方法引用提供了一种 引用而不执行方法 的方式,并且这个特性与Lambda Expression相似,读需要兼容的函数式接口构成上下文,在执行过程中,方法引用会创建函数式接口的一个实例。请看例子:

  1. 静态方法的方法引用
/**
 * @author junit
 *  泛型函数式接口
 */
@FunctionalInterface
public interface VariableFunction<T> {
    /**
     * 执行一些相关操作
     * @param t
     * @return
     */
    T someAction(T t);
}


/**
 * 定义了两个方法,这两个方法都与VarialbeFunction泛型函数式接口兼容
 * @author junit
 */
public class AToolClassForMethodReference {
    /**
     * 静态方法的方法引用Staric  
     * @param s
     * @return
     */
    public static String doSomething(String s) {
        StringBuilder temp = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ' ')
                temp.append(s.charAt(i));
            else
                continue;
        }
        return temp.toString();
    }

    /**
     * 实例方法的方法引用
     * @param s
     * @return
     */
    public String doSomethingElse(String s) {
        StringBuilder temp = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != ' ')
                temp.append(s.charAt(i));
            else
                continue;
        }
        return temp.toString();
    }
}

    /**
     * Java 8 静态方法引用
     * @param var (a functional Interface)
     * @param str
     * @return new String 
     */
    public static String chageString(VariableFunction<String> var,String str){
        return var.someAction(str);
    }
    /**
     * Java8 方法引用特性(Java 8 Method Reference)
     * 基本语法: ClassName::MethodName  -- 提供一种引用而不执行方法的方式!!!
     * 当使用ClassName.MethodName()时,被引用的方法将被执行,但是方法引用 ClassName::MethodName 
     * 只是获取该方法的引用,而不执行该方法,具体看程序分析
     * @param args
     */
    public static void main(String[] args){ 
        //Prepare test data
        String string_prepare="Java 8 Method Reference!";
        String for_print;
        /*
         * 如何理解:
         *   1:首先 ClassName::MethodName 的意义是获取一个方法的<big>引用</big>
         *      而不执行该方法
         * 
         *   2:以下这样给参数的使用方法,只是把doSomething这个方法的引用作为第一个参数,
         *
         *   3:为什么可以这样引用呢?因为AToolClassForMethodReference的doSomething(String s)
         *     方法与函数式接口VariableFunction的someAction(String s)方法兼容!也就是
         *     ToolClassForMethodReference的doSomething(String s)方法为函数式接口
         *     VariableFunction的someAction(String s)方法提供了方法实现
         */
        for_print=chageString(AToolClassForMethodReference::doSomething, string_prepare);
        System.out.println("Original String:"+string_prepare);
        System.out.println("String New:"+for_print);
    }
}
  • 运行结果(去掉了空格)

    Original String:Java 8 Method Reference!
    String New:Java8MethodReference!

    1. 实例方法的方法引用
public class MethodReferenceDynamicClass {
    /**
     * Java 8 Method Reference -- 实例方法的方法引用
     * ObjectReference::MethodName
     * @param args
     */
    public static void main(String[] args){
        //创建一个实例对象
        AToolClassForMethodReference toolClass=new AToolClassForMethodReference();
        String string_prepare="This is another test!";
        String print_string;
        //通过实例引用方法
        print_string=changeString(toolClass::doSomethingElse, string_prepare);
        System.out.println(print_string);
    }
    public static String changeString(VariableFunction<String> var,String str){
        return var.someAction(str);
    }
}


  • 运行结果(去掉了空格)

Thisisanothertest!


  1. 除了以上两种以外还可以有构造方法引用
//引用构造方法
classname::new

总结:

1:要理解方法引用,必须先理解Lambda表达式相关知识和函数式接口相关知识以及定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值