Java 函數式編程案例(函數式接口作爲參數和返回值)

案例1:函數式接口作爲參數

1. 1 原日誌代碼

public class Demo01Logger {
    //只有日誌等級爲1時,纔會打印日誌信息
    public static void showLog(int level, String massage){
        if(level==1){
            System.out.println(massage);
        }
    }

    public static void main(String[] args) {
        //定義三個日誌信息
        String msg1 = "hello";
        String msg2 = "world";
        String msg3 = "java";

        showLog(1,msg1+msg2+msg3);
    }
}

        如代碼所示,只有當level爲1時,日誌信息纔會打印,但是當level爲其他等級的時候,儘管不需要打印,但是日誌信息已經完成拼接,此時會造成系統性能的浪費。

1.2 優化的代碼

(1)函數式接口

/**
 * 函數式接口:有且只有一個抽象方法的接口,稱之爲函數式接口
 * 接口中可以包含其他方法,如:默認方法、靜態方法、私有方法
 */
@FunctionalInterface   //可以檢測接口是否是一個函數式接口,不滿足條件時編譯失敗
public interface messageBuilder {
    public abstract String builderMessage();
}

(2)優化代碼

public class Demo02Logger {
    //只有日誌等級爲1時,纔會打印日誌信息
    public static void showLog(int level, messageBuilder mb){
        if(level==1){
            System.out.println(mb.builderMessage());
        }
    }

    public static void main(String[] args) {
        //定義三個日誌信息
        String msg1 = "hello";
        String msg2 = "world";
        String msg3 = "java";
        //messageBuilder是一個函數式接口,所以可以傳遞Lambda表達式
        showLog(2,() -> {return msg1+msg2+msg3;});

        /*
        注意:Lambda表達式具有延遲加載的特性,當使用Lambda表達式將參數傳遞到對應的方法時,只有滿足條件的情況下,纔會對參數進行處理,不會存在性能的浪費
            例如:當日志等級爲1時,纔會調用builderMessage()方法,纔會進行字符串拼接
                 當日志等級不爲1時,不會調用builderMessage()方法,也就不會進行字符串拼接
         */
    }
}

案例2:函數式接口作爲返回值

import java.util.Arrays;
import java.util.Comparator;

public class ComparatorDemo {
    public static Comparator<String> getComparator(){

        //使用匿名內部類的方式實現返回接口
        /*return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();//按照字符串長度升序排列
            }
        };*/

        //使用Lambda表達式實現
        /*return (String o1, String o2)-> {
                return o1.length()-o2.length();//按照字符串長度升序排列
            };*/

        //簡化Lambda表達式
        return (o1, o2) -> o1.length()-o2.length();
    }

    //調用
    public static void main(String[] args) {
        String[] strs = {"aaa","bbbs","c","dd"};
        Arrays.sort(strs,getComparator());
        System.out.println(Arrays.toString(strs));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章