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