ich eine Liste eines benutzerdefinierten haben CallRecord ObjekteSumme und Max-Werte in einer einzigen Iteration
public class CallRecord {
private String callId;
private String aNum;
private String bNum;
private int seqNum;
private byte causeForOutput;
private int duration;
private RecordType recordType;
.
.
.
}
Es gibt zwei logische Bedingungen und der Ausgang jedes ist:
- Höchste SEQNUM, sum (Dauer)
- höchste SEQNUM, sum (Dauer), höchste causeForOutput
gemäß meinem Verständnis Stream.max(), Collectors.summarizingInt() usw. benötigen entweder mehrere Iterationen für das obige Ergebnis. Ich stieß auch auf einen thread, der kundenspezifischen Kollektor vorschlägt, aber ich bin unsicher.
Unten ist der einfache, Pre-Java 8-Code, der den Zweck dient:
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;
}
}
Was ist Ihre Frage? –
Konvertieren Sie den Pre-Java8-Code in den Java-Stream/Collector-Code IN EINZEL-Iteration –
Die Antwort ist in der Frage. Sie benötigen einen benutzerdefinierten Collector. Oder, da Sie bereits Code haben, der dem Zweck dient, können Sie diesen Code einfach behalten. –