讓Lambda表達式與受檢異常和諧共處

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

參考這裏

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章