ich die Java 8 Stream-API wie folgt aus:Overhead: Konvertieren zwischen Primitive Streams vs. Boxen
private Function<Long, Float> process; // Intermediate step (& types)
private long getWeekFrequency(final ScheduleWeek week) {
return week.doStreamStuff().count(); // Stream<>.count() returns long
}
@Override
public float analyse(final Schedule sample) {
return (float) sample // cast back to float
.getWeeks()
.stream()
.mapToLong(this::getWeekFrequency) // object to long
.mapToDouble(process::apply) // widen float to double
.sum();
}
@Override
public String explain(final Schedule sample) {
return sample
.getWeeks()
.stream()
.map(this::getWeekFrequency) // change stream type?
.map(String::valueOf)
.collect(Collectors.joining(", "));
}
Fragen
Ich nehme an, es Overhead ist, wenn zwischen dem Objekt zu ändern/primitive Stream-Typen ... Wie verhält es sich mit dem Boxen-Overhead, wenn ich mich an Stream <> halte?
Was ist, wenn ich später zurückwechsle?
Konkret:
In Analytiker soll ich .map(...).mapToDouble(...)
verwenden?
In erklären, sollte ich .mapToLong(...).mapToObj(...)
verwenden?
ändern Ich habe eine andere Frage hinzuzufügen: spielt es so viel in Ihrem System aus? Erleben/erwarten Sie irgendwelche Performance-Probleme? "Soll ich nur Double/Double überall verwenden" - was sagen Ihre Geschäftsanforderungen? Wie sieht dein Modell aus? – Thomas
Wenn dieser Code funktioniert, den Sie verbessern möchten, würde die Frage wahrscheinlich weitere interessante Antworten auf die [CodeReview SE] (https://codereview.stackexchange.com/) ziehen. Es kann jedoch eine Überarbeitung erforderlich sein, um die Teile, die Sie vereinfacht haben, sowie die Definition der beteiligten Klassen einzuschließen. – Aaron
@Thomas - Ich bin ziemlich zufrieden mit der Leistung (es ist ausreichend, also schätze ich die Lesbarkeit). Ich denke, ich möchte mehr darüber wissen, ob ich 'mapToLong()' vs 'map()' richtig im Zwischenteil eines Streams verwende. Ich werde das Double/Double Bit umschreiben ... das ist zu offen. – AjahnCharles