- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义 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;
.
.
.
}
有两个逻辑条件,每个条件的输出是:
据我了解,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/
当用户在 uisearchbar 中键入文本时,我正在过滤一个数组,但问题是我有一个警报处理程序,每次调用委托(delegate)时都会触发该处理程序,但我希望警报出现只有一次没有多次......代码
我有一个 HTML5、jQuery 卡片内存游戏,您可以通过一次翻转两张卡片来匹配卡片。我想在两张卡片匹配时播放动画,但因为我已经将 "transform: rotationY(180deg)" 应用
在我的 Jboss-EAP-6.1 中,我部署了一个名为 'myRealWebApp.war' 的 .war我可以使用此网址访问我的应用程序 - http://mywebsite.com/myReal
我是一名优秀的程序员,十分优秀!