java - 自定义函数: apply in 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)
    {
        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>)我究竟做错了什么?

最佳答案

这实际上是Bindable的一个很好的候选者(我认为我已经将其视为Holger的一些答案,但现在找不到)。 这样你就有了常用的解析方法:

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

基本上将日期绑定(bind)到谓词 - 因为日期不会改变,只有格式会改变。

然后

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

关于java - 自定义函数: apply in Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46325741/

相关文章:

c - 编译后忽略部分代码

javascript - 在 Javascript 中使用函数表达式而不是函数语句有什么意义?

python - 如何在spark并行处理中返回字典?

Java-Consumer中什么地方使用wait

java - 如何在 Java 中创建匹配正则表达式的字符串数组列表?

java - 如何使用来自 Java 类的参数调用 Python 脚本

java - 当我将策略设置为 HORIZONTAL_SCROLLBAR_​​AS_NEEDED 时,为什么看不到水平滚动条

matlab - 矩阵作为函数的输出

c++ - 返回 lambda 表达式的函数

java - Maven 构建期间出现 Lambda 错误