首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala到Java (函数式编程)

Scala到Java (函数式编程)
EN

Stack Overflow用户
提问于 2016-02-03 15:17:18
回答 2查看 156关注 0票数 0

我被要求将一些Scala代码“翻译”到Java中去学习一门课程。但是,分配的要求是Java8和外部库(如函数式Java完全懒散)不允许。Scala中的一行是:

代码语言:javascript
运行
复制
charges.groupBy(_.cc).values.map(_.reduce(_ combine _)).toList

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

GroupBy的实现方式如下:

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2016-02-03 15:35:44

为此您可以使用谷歌番石榴。它不需要java8。您尤其会对称为FluentIterable的类感兴趣。以下是一些可以帮助您的方法:

  • 索引(函数keyFunction) -用于为每个值生成键的函数
  • 转换(函数函数)-将{@code函数}应用于此流可迭代的每个元素

还有更多。

票数 1
EN

Stack Overflow用户

发布于 2016-02-03 15:30:55

您将不得不迭代这些值。通常,我建议使用一种新的样式for循环。类似于:

代码语言:javascript
运行
复制
for (ValuesType value : values) {
    // do your map and reduce here
}

问题是,您需要一次访问多个值。(见下文对.reduce()的讨论。)因此,也许旧风格的for会更好一些:

代码语言:javascript
运行
复制
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()!所以这应该很容易。

_ in _.reduce()相当于上面for语句中的value。这是您在这个迭代中要处理的一个值。

.reduce()接受两个值,并对它们做一些事情来将它们转换为单个值。要做到这一点,您需要以某种方式处理values.get(i)values.get(i+1)_ combine _,嗯,你告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35180851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档