Java 自定义函数:在流中应用

Java 自定义函数:在流中应用,java,function,lambda,java-8,java-stream,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) {

我有以下代码:

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));
函数funcParse=(字符串f)->{
DateTimeFormatter formatter=模式的DateTimeFormatter.of(f);
尝试
{
解析(日期,格式化程序);
}
捕获(DateTimeParse异常)
{
返回false;
}
返回true;
};
stream(MONTHYEAR\u FORMATS.split(“\\\\”).findFirst(format->funcParse.apply(format));
这里有语法警告:
apply(java.lang.String)在函数中不能应用到()
我做错了什么?

这实际上是可绑定的
的一个很好的候选者(我想我已经看到了霍尔格的一些答案,但现在找不到)。
因此,您有了常用的解析方法:

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);
}
使用方法非常简单:

 String date = "SomeDate";
 Predicate<String> predicate = bindValue(toPredicate, date);
 Arrays.stream(MONTHYEAR_FORMATS.split("|"))
       .filter(predicate)
       .findFirst();
String date=“SomeDate”;
谓词=bindValue(toPredicate,date);
Arrays.stream(MONTHYEAR_格式.split(“|”))
.filter(谓词)
.findFirst();

findFirst()
不接受任何参数。您可以使用
.filter(..).findFirst()
,并让
funcParse
成为
谓词
。但是创建
函数
而不是首先创建
谓词
的意义何在?
 String date = "SomeDate";
 Predicate<String> predicate = bindValue(toPredicate, date);
 Arrays.stream(MONTHYEAR_FORMATS.split("|"))
       .filter(predicate)
       .findFirst();