我被要求将一些Scala代码“翻译”到Java中去学习一门课程。但是,分配的要求是Java8和外部库(如函数式Java和完全懒散、)不允许。Scala中的一行是:
charges.groupBy(_.cc).values.map(_.reduce(_ combine _)).toList
我已经能够写groupBy
和values
了,但是.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;
}
发布于 2016-02-03 15:35:44
为此您可以使用谷歌番石榴。它不需要java8。您尤其会对称为FluentIterable
的类感兴趣。以下是一些可以帮助您的方法:
还有更多。
发布于 2016-02-03 15:30:55
您将不得不迭代这些值。通常,我建议使用一种新的样式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()
!所以这应该很容易。
_
in _.reduce()
相当于上面for
语句中的value
。这是您在这个迭代中要处理的一个值。
.reduce()
接受两个值,并对它们做一些事情来将它们转换为单个值。要做到这一点,您需要以某种方式处理values.get(i)
和values.get(i+1)
。_ combine _
,嗯,你告诉我。
https://stackoverflow.com/questions/35180851
复制相似问题