在lambda中處理檢查異常是個比較大的問題,有的時候我們會將它轉換成乙個執行時異常再向上丟擲
mylist.stream()
.map(item -> catch (myexception e)
}).foreach(system.out::println);
或者這樣:
mylist.stream()
.map(this::trysomething)
.foreach(system.out::println);
private item trysomething(item item) catch (myexception e)
}
上面這種方式我們每次都要有try catch,下面來看一種更簡單的方式:
step1:
@functionalinte***ce
public inte***ce checkedfunction
step2:
public static functionwrap(checkedfunctioncheckedfunction) catch (exception e)
};}
然後就可以愉快的使用了:
mylist.stream()
.map(wrap(item -> dosomething(item)))
.foreach(system.out::println);
這種方式有個問題,就是出現異常,整個lambda就gg了,那麼有沒有其他的方式呢?
這裡介紹乙個either類,左面存異常,右面存返回結果:
step1:
public class either
public static eitherleft( l value)
public static eitherright( r value)
public optionalgetleft()
public optionalgetright()
public boolean isleft()
public boolean isright()
if (isleft())
return optional.empty();
}if (isright())
return optional.empty();
}public string tostring()
return "right(" + right +")";
}}
ster2:
public static functionlift(checkedfunctionfunction) catch (exception ex)
};}
然後就可以使用了:
mylist.stream()
.map(either.lift(item -> dosomething(item)))
.foreach(system.out::println);
然後我們就可以用filter過濾出來了,或者我們只過濾右邊把異常乾掉
然鵝,現在又有問題了,我們有的時候收集造成異常的資料,我們就可以常用這種方式:
public static functionliftwithvalue(checkedfunctionfunction) catch (exception ex)
};}
左面的是:
public class pair
public static pairof(f fst, s snd)
}
這樣,我們就可以獲得造成異常的原始值然後愉快的進行重試了,這種在大資料上感覺比較好用 java8 lambda 處理List 例項
最近遇到lambda 的表示式,總結了一下,用乙個稍微複雜的小例子 總結一下 public class streamtest 2 呼叫判斷方法來實現 list.stream filter map getsum map foreach map map.foreach k,v system.out.pr...
java中 lambda表示式
可以簡單理解為乙個匿名方法。lambda表示式 中為引數 介面中方法的引數 中為方法體 整體返回此介面。如 new thread system out println 這是run方法 start system out println 這是run方法 等同於 newrunnable system ou...
JAVA中lambda表示式
lambda表示式 引數部分 1.只有針對單方法的介面才能使用lambda表示式進行簡化 介面裡只有乙個方法 new thread start 2.當花括號裡只有一條語句時,花括號可以省略 3.lambda表示式可以進行引數的型別判斷 引數部分只保留引數名,型別名可以省略 4.體裡面只有一條語句時,...