gpt4 book ai didi

java-8 - 单次迭代中的总和和最大值

转载 作者:行者123 更新时间:2023-12-01 09:46:48 25 4
gpt4 key购买 nike

我有一个自定义 CallRecord 对象的列表

public class CallRecord {

private String callId;
private String aNum;
private String bNum;
private int seqNum;
private byte causeForOutput;
private int duration;

private RecordType recordType;
.
.
.
}

有两个逻辑条件,每个条件的输出是:

  1. 最高seqNum, sum(duration)
  2. 最高 seqNum,总和(持续时间),最高 causeForOutput

据我了解,Stream.max() , Collectors.summarizingInt()等等将需要对上述结果进行多次迭代。我还遇到了 thread建议自定义收集器,但我不确定。

下面是用于此目的的简单的 Java 8 之前的代码:

if (...) {

for (CallRecord currentRecord : completeCallRecords) {
highestSeqNum = currentRecord.getSeqNum() > highestSeqNum ? currentRecord.getSeqNum() : highestSeqNum;
sumOfDuration += currentRecord.getDuration();
}

} else {
byte highestCauseForOutput = 0;

for (CallRecord currentRecord : completeCallRecords) {
highestSeqNum = currentRecord.getSeqNum() > highestSeqNum ? currentRecord.getSeqNum() : highestSeqNum;
sumOfDuration += currentRecord.getDuration();

highestCauseForOutput = currentRecord.getCauseForOutput() > highestCauseForOutput ? currentRecord.getCauseForOutput() : highestCauseForOutput;
}

}

最佳答案

您希望在一次迭代中完成所有事情是不合理的。您应该首先追求简单,必要时追求性能,但坚持单次迭代两者都不是。

性能取决于太多因素,无法提前做出预测。迭代(在一个普通集合上)本身的过程不一定是一个昂贵的操作,甚至可以从更简单的循环体中受益,这种循环体使得具有直接操作的多次遍历比尝试做所有事情的单次遍历更有效一次。找出答案的唯一方法是使用实​​际操作进行测量。

将操作转换为 Stream 操作可能会简化代码,如果您直接使用它,即

int highestSeqNum=
completeCallRecords.stream().mapToInt(CallRecord::getSeqNum).max().orElse(-1);
int sumOfDuration=
completeCallRecords.stream().mapToInt(CallRecord::getDuration).sum();
if(!condition) {
byte highestCauseForOutput = (byte)
completeCallRecords.stream().mapToInt(CallRecord::getCauseForOutput).max().orElse(0);
}

如果您仍然对多次迭代感到不舒服,您可以尝试编写一个自定义收集器一次执行所有操作,但结果不会比您的循环好,无论是在可读性还是效率方面。

不过,与尝试在一个循环中完成所有操作相比,我更愿意避免代码重复,即

for(CallRecord currentRecord : completeCallRecords) {
int nextSeqNum = currentRecord.getSeqNum();
highestSeqNum = nextSeqNum > highestSeqNum ? nextSeqNum : highestSeqNum;
sumOfDuration += currentRecord.getDuration();
}
if(!condition) {
byte highestCauseForOutput = 0;
for(CallRecord currentRecord : completeCallRecords) {
byte next = currentRecord.getCauseForOutput();
highestCauseForOutput = next > highestCauseForOutput? next: highestCauseForOutput;
}
}

关于java-8 - 单次迭代中的总和和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47090888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com