【问题标题】:Scala to Java (functional programming)Scala 到 Java(函数式编程)
【发布时间】:2016-05-12 20:59:08
【问题描述】:

我被要求为一门课程将一些 Scala 代码“翻译”成 Java。但是,作业的要求是 Java 8 和外部库,例如 Functional JavaTotally Lazy不允许。 Scala 中的行是:

charges.groupBy(_.cc).values.map(_.reduce(_ combine _)).toList

我已经能够写出groupByvalues,但.map_.reduce 仍然无法使用。我查看了这两个库的源代码以及 Scala 源代码,试图找到一些可以帮助我将它们组合在一起的东西,但我没有取得任何进展。

GroupBy 实现如下:

public Map<CreditCard, List<Charge>> groupBy(List<Charge> list)
{
    Map<CreditCard, List<Charge>> map = new TreeMap<CreditCard, List<Charge>>();
    for(Charge c: list)
    {
        List<Charge> group = map.get(c.cc);
        if(group == null)
        {
            group = new ArrayList();
            map.put(c.cc, group);
        }
        group.add(c);
    }
    return map;
}

【问题讨论】:

  • 我有点困惑,你能够实现 groupBy 和 values 但在 map 上苦苦挣扎。什么是逃避部分?
  • Values 可能没有正确实现,因为我使用了 map.values() ,但在这个例子中它给出了正确的结果。至于 map ......逃避的部分是传递函数作为参数和那种东西的事实。我想在 Java 中使用 JDK7 或更低版本找到 map() 实现,但没有找到通用实现。
  • groupBy 也传入了一个函数。您刚刚忽略了这一点并直接使用了c.cc。如果 groupBy 可以接受,那么大概你可以做同样的 fpr map

标签: java scala functional-programming java-7


【解决方案1】:

您可以为此使用Google Guava。它不需要java8。你会对调用FluentIterable 的课程特别感兴趣。这里有一些方法可以帮助你:

  • index(Function keyFunction) - 用于为每个值生成键的函数
  • transform(Function function) - 将 {@code function} 应用于此流利可迭代对象的每个元素

还有更多。

【讨论】:

    【解决方案2】:

    您必须迭代这些值。通常我建议使用新样式for 循环。比如:

    for (ValuesType value : values) {
        // do your map and reduce here
    }
    

    这样做的问题是您需要一次访问多个值。 (参见下面对.reduce() 的讨论。)所以也许旧式for 会更好:

    for (int i = 0; i < values.length - 1; i++) {
        // do something with values.get(i) or values[i] as needed
    }
    

    思考点:为什么values.length - 1

    .map() 只是将一件事转化为另一件事。在这种情况下有什么转变?这是.reduce()!所以这应该很容易。

    _.reduce() 中的 _ 等效于上述 for 语句中的 value。这是您在本次迭代中处理的一个值。

    .reduce() 接受两个值并对它们进行处理以将它们转换为单个值。要完成这项工作,您需要以某种方式处理values.get(i)values.get(i+1)。还有_ combine _,好吧,你告诉我。

    【讨论】:

    • 谢谢! combine 方法不是问题,但我不太明白_ combine _ 的下划线是什么意思。它应该是 array[i].combine(array[i+1]),但是这在实践中不起作用。
    • _combine _(x,y)=&gt;x.combine(y) 相同,因此 combine 方法必须来自某个地方,它不在 scala 标准库中。所以我希望任务在某个地方定义了这一点。 Charge的定义是什么? (我敢打赌combine 基本上是+,因为代码的目的似乎是总结信用卡收费......)
    • 我写了combine 方法并且它有效。现在它只是让 Java 中的所有东西都能正常工作,这似乎是不可能的。
    • @m482 很难,当然。但是 Scala 是建立在 JVM 之上的,所以它必须是可能的。 (不完全是合理的推理,但至少是为了鼓舞人心。)
    猜你喜欢
    • 2011-05-07
    • 2017-04-16
    • 2011-10-23
    • 2021-08-23
    • 2021-05-26
    • 2018-06-05
    • 1970-01-01
    • 2020-10-02
    • 2016-08-18
    相关资源
    最近更新 更多