3
我正在玩弄FunctionalInterface
的使用。我已經看到下面的代碼隨處可見的多種變化:Java - lambda推斷類型
int i = str != null ? Integer.parseInt() : null;
我在尋找以下行爲:
int i = Optional.of(str).ifPresent(Integer::parseInt);
但ifPresent
只接受Supplier
和Optional
不能擴展。
我創建了以下FunctionalInterface
:
@FunctionalInterface
interface Do<A, B> {
default B ifNotNull(A a) {
return Optional.of(a).isPresent() ? perform(a) : null;
}
B perform(A a);
}
這讓我做到這一點:
Integer i = ((Do<String, Integer>) Integer::parseInt).ifNotNull(str);
可以添加多個默認的方法做這樣的事情
LocalDateTime date = (Do<String, LocalDateTime> MyDateUtils::toDate).ifValidDate(dateStr);
而且它很好地讀取Do [my function] and return [function return value] if [my condition] holds true for [my input], otherwise null
。
爲什麼不能編譯器推斷類型的A
(String
傳遞給ifNotNull
)和B
(由parseInt
返回Integer
),當我做到以下幾點:
Integer i = ((Do) Integer::parseInt).ifNotNull(str);
這導致:
不兼容類型:無效方法參考
好啊,我沒有意識到'Optional'的'map'功能。謝謝! – Ian2thedv
很高興幫助。看看'Optional#flatMap'是'Optional'方法中最普遍的方法 –