2017-09-20 78 views
1

我有以下代碼:自定義功能:適用於流

Function<String,Boolean> funcParse = (String f)-> { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(f); 
    try 
    { 
     YearMonth.parse(date , formatter); 
    } 
    catch (DateTimeParseException e) 
    { 
     return false; 
    } 
    return true; 
}; 

Arrays.stream(MONTHYEAR_FORMATS.split("\\|")).findFirst(format -> funcParse.apply(format)); 

我在這裏的語法警告:apply (java.lang.String) in Function cannot be applied to (<lambda parameter>)什麼我做錯了什麼?

+2

'的FindFirst()'不帶任何參數。你可以使用'.filter(..)。findFirst()',並且讓'funcParse'成爲'Predicate '。 –

+3

但是,首先創建一個'Function '而不是創建'Predicate '的意義在哪裏呢? – Holger

+0

謝謝,我同意 –

回答

1

這實際上是爲Bindable一個很好的候選人(我認爲我已經看到了這個,因爲一些霍爾格的答案,但現在不能找到它)。 所以,你有你平時的解析方法:

static boolean parse(String date, String format) { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); 
    try { 
     YearMonth.parse(date, formatter); 
    } catch (DateTimeParseException e) { 
     return false; 
    } 
    return true; 
} 

與您共創bindValue方法:

public static <T, U> Predicate<U> bindValue(BiFunction<T, U, Boolean> f, T t) { 
    return u -> f.apply(t, u); 
} 

基本上結合datePredicate - 因爲date不會改變,只有format一樣。

然後

BiFunction<String, String, Boolean> toPredicate = Bindable::parse; 
Predicate<String> predicate = bindValue(toPredicate, date); 

使用情況,這很簡單:

String date = "SomeDate"; 
Predicate<String> predicate = bindValue(toPredicate, date); 
Arrays.stream(MONTHYEAR_FORMATS.split("|")) 
     .filter(predicate) 
     .findFirst();