java8 Function 函數式接口的妙用


Function 函數式接口

使用注解@FunctionalInterface標識,並且只包含一個抽象方法的接口是函數式接口。函數式接口主要分為:

  • Supplier供給型函數:Supplier的表現形式為不接受參數、只返回數據。
  • Consumer消費型函數:Consumer接收一個參數,沒有返回值。
  • Runnable無參無返回型函數:Runnable的表現形式為即沒有參數也沒有返回值。
  • Function有參有返回型函數:Function函數的表現形式為接收一個參數,並返回一個值。

1、處理業務異常

示例:

public void isTrue(String msg){
	// 業務處理...
	boolean conditon;
	if(conditon){
		throw new RuntimeException(msg);
	}
}

Function函數式編程:

 FuncUtil.isTure(conditon).throwMessage("測試異常");

第一步:定義一個拋出異常的函數式接口, 消費型接口:只有參數沒有返回值

@FunctionalInterface
public interface ThrowExceptionFunction {

    /**
     * 拋出異常信息
     *
     * @param message 異常信息
     **/
    void throwMessage(String message);
}

第二步:定義一個工具類 FuncUtil.isTure(boolean b)

	/**
     * 處理拋出異常
     */
    public static ThrowExceptionFunction isTure(boolean b) {
        return (errorMessage) -> {
            if (b) {
                throw new RuntimeException(errorMessage);
            }
        };
    }

2、處理if...else...分支操作

示例:

public void isTureOrFalse(){
	// 業務處理...
	boolean a;
	if(a){
		System.out.println("true 邏輯");
	} else {
		System.out.println("false 邏輯");
	}

}

Function函數式編程:

FuncUtil.isTureOrFalse(true)
		.trueOrFalseHandle(() -> System.out.println("true 邏輯"), () -> System.out.println("false 邏輯"));

第一步:定義一個分支處理函數式接口,接口的參數為兩個Runnable接口。這兩個兩個Runnable接口分別代表了為true或false時要進行的操作

@FunctionalInterface
public interface BranchFunction {

    /**
     * 分支操作
     *
     * @param trueHandle 為true時要進行的操作
     * @param falseHandle 為false時要進行的操作
     **/
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);
}

第二步:定義一個工具類 FuncUtil.isTureOrFalse(boolean b)

    /**
     * 參數為true或false時,分別進行不同的操作
     */
    public static BranchFunction isTureOrFalse(boolean b) {
        return (trueHandle, falseHandle) -> {
            if (b) {
                trueHandle.run();
            } else {
                falseHandle.run();
            }
        };
    }

3、處理if...else...分支操作,並消費輸入參數

示例:

public void isBlankOrNoBlank(String msg){
	if(null==msg || ''==msg){
		System.out.println("msg為空");
	} else {
		System.out.println("msg is:"+msg);
	}

}

Function函數式編程:

FuncUtil.isBlankOrNoBlank("test")
                .presentHandle(System.out::println,
                        ()-> System.out.println("空字符串"));

第一步:定義一個PresentFunction的函數式接口,接口的參數一個為Consumer接口。一個為Runnable,分別代表值不為空時執行消費操作和值為空時執行的其他操作

public interface PresentFunction<T extends Object> {
    /**
     * 值不為空時執行消費操作
     * 值為空時執行其他的操作
     *
     * @param action 值不為空時,執行的消費操作
     * @param emptyAction 值為空時,執行的操作
     **/
    void presentHandle(Consumer<? super T> action, Runnable emptyAction);
}

第二步:定義一個工具類 FuncUtil.isTureOrFalse(boolean b)

    /**
     * 參數為true或false時,分別進行不同的操作
     */
    public static PresentFunction<?> isBlankOrNoBlank(String str) {
        return (consumer, runnable) -> {
            if (str == null || str.length() == 0) {
                runnable.run();
            } else {
                consumer.accept(str);
            }
        };
    }

更多高級用法詳見github:https://gitee.com/open-cloud-framework/open-demo.git


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM