Lambda表达式与受检异常的矛盾
Lambda极大简化了我们的代码,让我们的代码变得整洁优雅(虽然有很多表达式很难看懂,没怎么特意学习lambda表达式的话)。但是当Lambda表达式中需要处理受检异常时,就会破坏掉这种整洁优雅的布局,让代码变得非常难看。
这里借鉴这里大佬的例子做一个举例说明
long count = Files.walk(Paths.get("D:/Test")) // 获得项目目录下的所有文件
.filter(file -> !Files.isDirectory(file)) // 筛选出文件
.filter(file -> file.toString().endsWith(".java")) // 筛选出 java 文件
.flatMap(file -> {
try {
return Files.lines(file);
} catch (IOException ex) {
ex.printStackTrace(System.err);
return Stream.empty(); // 抛出异常时返回一个空的 Stream
}
}) // 按行获得文件中的文本
.filter(line -> !line.trim().isEmpty()) // 过滤掉空行
.count();
作为一名资深强迫者,怎么会让这种情况出现呢╮(╯▽╰)╭。既然,他俩出现矛盾了,不想在一起干活了肯定就要出来一个和事佬过来劝架啦!
劝架流程(受检异常转移)
既然我Lambda不想和异常合作,但是工作老板下命令了。必须你俩都有都得干(没办法,底层没抛出异常,必须捕获)。那就只能辛苦和事佬了。Lambda和和事佬合作,和事佬和受检异常合作。
首先定义一个和事佬,处理异常。Lambda调用和事佬
/**
* 受检的 function
* @FunctionalInterface 用于编译级错误检查,声明该接口是函数式接口。该注解修饰的接口只能有一个抽
* 象方法
*/
@FunctionalInterface
public interface CheckedFunction<T, R> {
/**
* Run the Function
*
* @param t T
* @return R R
* @throws Throwable CheckedException
*/
@Nullable
R apply(@Nullable T t) throws Throwable;
}
@UtilityClass
public class Unchecked {
//这里其实是将Function的方法实现了一下返回。异常在内部已经被捕获不会到Lambda层面
public static <T, R> Function<T, R> function(CheckedFunction<T, R> mapper) {
Objects.requireNonNull(mapper);
return t -> {
try {
return mapper.apply(t);
} catch (Throwable e) {
throw Exceptions.unchecked(e);
}
};
}
}
到时候让lambda和和事佬Unchecked沟通,和事佬再和真正的要求检查异常的沟通,异常和事佬捕获。并对其作出处理。
Unchecked.function(uncheckedFunction)即可