自定义功能:在Stream中应用

时间:2017-09-20 15:10:46

标签: java function lambda java-8 java-stream

我有以下代码:

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>)我做错了什么?

1 个答案:

答案 0 :(得分:1)

这实际上是Bindable的合适人选(我认为我已将此视为Holger的一些答案,但可以&#39 ;现在找到它)。 所以你有通常的解析方法:

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);
}

基本上将date绑定到Predicate - 因为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();