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

java8 Function 函数式接口的妙用

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

java8 Function 函数式接口的妙用

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

java8 Function 函数式接口的妙用

上一篇:JAVA8


下一篇:Java8新特性_默认方法