【问题标题】:ArrayList to Stream in Java by groupingArrayList通过分组在Java中流式传输
【发布时间】:2019-01-25 17:07:02
【问题描述】:

我想通过 Id 获得最高分组。如果两个最高分相同,那么我想根据最低可选 ID 获得最高分。我想在 Java Stream 中获得它。到目前为止,此代码有效.有什么有效的方法可以在java流中重写这段代码

例子:

records=record.Person(batchNumber);
List<Person> highestRecords = new ArrayList<>();for(
Person s:records)
  {
if(!highestRecords.isEmpty()) {
    boolean contains = false;
    for(Person ns: new ArrayList<>(highestRecords)) {
        if(s.Id().compareTo(ns.Id()) == 0) {
            contains = true;
            if(s.getScore.compareTo(ns.getScore()) > 0     
    && s.optionalId().compareTo(ns.optionalId()) < 0) {

                highestRecords.remove(ns);
                highestRecords.add(s)       
            }
        }
    }
    if(contains == false) {
        highestRecords.add(s);
    }
}else {
    highestRecords.add(s);
}
  }
}

【问题讨论】:

  • 好的,我们看到你有用于每个循环的代码,你为什么不解释一些输入和输出示例
  • 变量名真的很混乱,为什么List&lt;Person&gt;getNewPendingMatches?也许第一步应该是在考虑转换为 FP 之前清理现有的解决方案。
  • 您知道,我确实看到了您对问题所做的修改。如果您希望这可能会诱使某人将其写成流,那是……不太可能。
  • 谢谢,我以为我的问题不清楚,所以我做了一些更改
  • 离题,但我强烈建议您查看变量的命名实践,因为这段代码很难阅读。不要将变量命名为getX,因为这个名称暗示了一个将返回类成员的方法,因此阅读它会让人感到困惑。此外,更好地将名称分开,具有几乎相同名称的变量也会使代码更难理解。

标签: java


【解决方案1】:

不要将其转换为流。

这里没有一个纯操作发生。有好几个。

值得注意的是初始操作:

if(getNewPendingMatches.size() > 0) 

这在第一次迭代时总是错误的,你总是要添加一个元素。

在随后的迭代中,生活变得奇怪,因为现在你试图在迭代它们的同时删除元素。流在迭代自身时不能从自身中删除值;它只在一个方向处理。

在编写时,不应将此代码转换为流。这样做不会有任何好处,而且会严重损害可读性。

【讨论】:

  • ....“在随后的迭代中,生活变得很奇怪”——非常同意。不确定代码的可读性会比现在低!
  • @MarkKeen:你知道什么会让它更难读吗?将其转换为流。 ;)
  • 流将是非常可读的......基于示例要求,未提供代码......
  • 嗯 - 老实说,我无法看到 forEaches 需要将它们粘合在一起的方式......
  • ha .. 正如我根据示例输出所说,未提供代码.. 根据我对 OP 问题的评论..
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2016-06-20
相关资源
最近更新 更多