在写lambda表达式的时候遇到非运行时异常,会发现 lambda表达式中需要处理一遍,调用的地方还需要处理一遍例如:
需要做如下处理
看起来很丑,用起来很不方便,这种异常的类在
RestHighLevelClient中的方法很常见,如下:
每一次调用try Cathy 用起来很麻烦,能不能 用lambda 解决呢?
自己定义异常类
如:
@FunctionalInterface
public interface ThrowingFunction<T,E > {
//对异常选择上抛 原Function接口没有上抛 才使得不好处理
E apply (T t) throws Exception;
}
@FunctionalInterface
public interface ThrowingConsumer<T> {
void accept(T t) throws Exception;
}
优化后代码如下:
public class TestException {
public static void testIoException(String line) throws IOException {
System.out.println(line);
FileReader fileReader = new FileReader("");
}
public static void tryExcptionTest(String line, Consumer<String> consumer) {
try {
consumer.accept(line);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void tryException(String line,ThrowingConsumer<String> throwingConsumer){
try {
throwingConsumer.accept(line);
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
tryException("优化异常",TestException::testIoException);
tryExcptionTest("124", line -> {
try {
testIoException(line);
} catch (Exception e) {
}
});
}
}
执行结果如下:
完美解决 ,在
public static void tryException(String line,ThrowingConsumer<String> throwingConsumer){
try {
throwingConsumer.accept(line);
}catch (Exception e){
e.printStackTrace();
}
}
// 通过这种方式就可以 消除 非运行时异常 每一次调用都要处理异常的 重复代码
// 调用方式如下:
tryException("优化异常",TestException::testIoException);
针对ElasticSearch 中的统一处理方式如下:
public TransportMessage executor(RestHighLevelClient client, ThrowingFunction<RestHighLevelClient, TransportMessage> function) {
try {
return function.apply(client);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}