Kal*_*ist 3 java-8 java-stream collectors
我有一个自定义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;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
有两个逻辑条件,每个的输出是:
根据我的理解,Stream.max(),Collectors.summarizingInt()等将要求对上述结果进行多次迭代.我也遇到了一个暗示定制收藏家的帖子,但我不确定.
下面是为此目的提供的简单的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;
}
}
Run Code Online (Sandbox Code Playgroud)
你希望在一次迭代中完成所有事情是不合理的.你应该首先考虑简单性,必要时要提高性能,但坚持单次迭代既不是.
性能取决于太多因素,无法提前做出预测.迭代(通过普通集合)本身的过程不一定是一个昂贵的操作,甚至可能从一个更简单的循环体中受益,使得多次遍历具有直接操作比单次遍历尝试执行所有操作更有效一旦.找出的唯一方法是使用实际操作进行测量.
将操作转换为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);
}
Run Code Online (Sandbox Code Playgroud)
如果您仍然对多次迭代这一事实感到不舒服,您可以尝试编写一个自定义收集器,同时执行所有操作,但结果不会比您的循环更好,无论是在可读性还是效率方面.
尽管如此,我宁愿避免代码重复而不是试图在一个循环中完成所有事情,即
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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |