【问题标题】:Why is there no reduce in Guava library?为什么 Guava 库中没有 reduce?
【发布时间】:2014-12-16 00:58:03
【问题描述】:

我想在我的 Android 应用程序中使用函数式编程,但由于 Java8 不可用,我决定使用 Guava 库。但显然 Guava 库中没有 REDUCE 聚合。如果有人能解释为什么会这样,我很想知道,但我需要的是一种解决方法。

如何在 Guava 中模拟 REDUCE/DROP 函数式编程特性?例如,如何在 FluentInterface 上计算总和或平均值,而无需从头开始编写代码(函数式编程的主要原则之一,不是吗?)。

如果您使用 Android 中的另一个库完成此操作,请也告诉我。

【问题讨论】:

    标签: java android guava reduce


    【解决方案1】:

    Guava 不支持这一点,因为您需要构建的匿名类最终比传统的命令式 for 循环要冗长得多。 Guava 特意只提供了一组有限的函数式编程风格特性:参见例如https://github.com/google/guava/wiki/FunctionalExplained#Caveats了解详情。

    让我们想象一下 Guava 确实提供了这个。它必须看起来像

    FluentIterable.from(integers).foldr(
      new BiFunction<Integer, Integer, Integer>() {
        @Override Integer sum(Integer a, Integer b) {
          return a + b;
        }
      }, 0);
    

    ...与...

    int sum = 0;
    for (int value : integers) {
       sum += value;
    }
    

    第二个版本需要的样板文件要少得多。在语言中没有 lambda 的情况下,这是不值得的。

    【讨论】:

    • @u2gilles 此外,Guava 中没有 BiFunction 这样的东西 - 请参阅 IdeaGraveyardthis issue
    • 感谢 Louis 确认和解释 Guava 故意限制了函数式编程特性。但我仍然认为 REDUCE/COLLECT 特性是函数库中必须的。就您(或谷歌)的简单原因而言,我有点想将苹果和橙子与我的想法进行比较。底层函数库中有很多隐藏的功能,这使得与您的第二个示例进行比较不太可能。是的,第二个循环很简单,但它并不是“功能性”的。
    • 此外,如果代码缩进良好,冗长就不是什么大问题。如果我找不到简单的解决方法,我不会在 Android 中使用 Guava,我会尝试找到另一个可用于 Java6 Android 的函数式编程库。如果您或任何人有任何建议,请告诉我。
    • Guava 的观点是,目标本身并不是一种函数式风格:目标是高效、可读的代码。函数式样式仅在它使您的代码更具可读性时才有用,在这种情况下它没有。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多