在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...
if (...){
throw new RuntimeException("发生异常了");
}
//举例
if (...){
doSomething();
} else {
doOther();
}
Function 函数式接口
使用注解@FunctionalInterface标识,并且只包含一个抽象方法的接口是函数式接口。函数式接口主要分为Supplier供给型函数、Consumer消费型函数、Runnable无参无返回型函数和Function有参有返回型函数。
提供自定义的函数进行转化
Function fun = x -> DateUtil.parse(x.replaceAll("/", "-"), "yyyy-MM-dd").getTime() / 1000;
//提供传入的时间格式的字符串
fun.apply(param);
Function可以看作转换型函数
Supplier供给型函数
Supplier的表现形式为不接受参数、只返回数据
/**
*表示结果的提供者。
*不要求每次返回一个新的或不同的结果
*调用供应商的时间。
*
这是一个功能界面
*其函数方法为{@link#get()}。
*@param此供应商提供的结果类型
*@自1.8起
*/
@FunctionalInterface
public interface Supplier {
/**
*获取结果。
*@return a结果
*/
T get();
}
- 测试代码:
public static void main(String[] args){
//创建Supplier容器,声明为UserLog类型,此时并不会调用对象的构造方法,即不会创建对象
Supplier sup=UserLog::new;
//调用get()方法,此时会调用对象的构造方法,即获得到真正对象
UserLog userLog=sup.get();
userLog.setId(1);
System.out.println(userLog);
//每次get都会调用构造方法,即获取的对象不同
System.out.println(sup.get());
}
- 输出结果
Consumer消费型函数
Consumer消费型函数和Supplier刚好相反。Consumer接收一个参数,没有返回值
/**
*表示接受单个输入参数并返回no的操作
*结果。与大多数其他功能接口不同,需要{@codeConsumer}
*通过副作用进行操作。
*这是一个功能界面
*其函数方法为{@link#accept(Object)}。
*@param操作的输入类型
*@自1.8起
*/
@FunctionalInterface
public interface Consumer {
/**
*对给定参数执行此操作。
*@param t输入参数
*/
void accept(T t);
/**
*返回按顺序执行以下操作的组合{@code Consumer}
*操作后跟{@code-after}操作。如果执行以下任一操作
*操作抛出异常,它被中继到
*组合操作。如果执行此操作会引发异常,
*不会执行{@code-after}操作。
*@param在操作后执行此操作后
*@return一个按顺序执行此操作的组合{@code消费者}
*操作后跟{@code-after}操作
*如果{@code-after}为空,@throws NullPointerException
*/
default Consumer andThen(Consumer super t> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
例子:
Consumer nameConsumer = s -> System.out.println(s);
nameConsumer.accept("张三");
nameConsumer.accept("李四");
System.out.println("===================");
List numList = Arrays.asList(1, 2, 3, 4);
Consumer<List> squareConsumer = list -> {
for (int i = 0; i < list.size(); i++) {
list.set(i, list.get(i) * list.get(i));
}
};
Consumer<List> printConsumer = list -> list.forEach(n -> System.out.println(n));
squareConsumer.andThen(printConsumer).accept(numList);
输出结果:
使用小技巧
处理抛出异常的if
/**
* 抛异常接口
* 定义一个抛出异常的形式的函数式接口, 这个接口只有参数没有返回值是个消费型接口
**/
@FunctionalInterface
public interface ThrowExceptionFunction {
/**
* 抛出异常信息
* @param message 异常信息
* @return void
**/
void throwMessage(String message);
}
/**
* 如果参数为true抛出异常
* 创建一个isTure方法,方法的返回值为刚才定义的函数式接口-ThrowExceptionFunction。
* ThrowExceptionFunction的接口实现逻辑为当参数i大于j时抛出异常
* @param i,j
**/
public static ThrowExceptionFunction isTure(int i,int j){
return (errorMessage) -> {
if (i>j){
throw new RuntimeException(errorMessage);
}
};
}
public static void main(String[] args){
//调用方法,传入参数后,调用函数式接口的throwMessage方法传入异常信息
TestController.isTure(10,5).throwMessage("运行时异常");
}
本文暂时没有评论,来添加一个吧(●'◡'●)