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)即可

参考这里