Scala到Java(函数式编程)

我被要求将一些Scala代码“翻译”为Java以用于课程。 但是,分配的要求是不允许使用 Java 8和外部库,例如Functional Java和Totally Lazy 。 Scala中的行是:

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

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

GroupBy实现如下:

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

你可以使用Google Guava 。 它不需要java8。 你会特别感兴趣的是一个叫FluentIterable 。 这里有一些方法可以帮助你:

  • index(Function keyFunction) – 用于为每个值生成键的函数
  • transform(函数函数) – 将{@code函数}应用于此流畅迭代的每个元素

而且还有很多。

你将不得不迭代这些值。 通常我建议使用新for循环风格。 就像是:

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

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

 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 _ ,嗯,你告诉我。