1. 程式人生 > 其它 >java8 Function 函式式介面的妙用

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);
            }
        };
    }