ich eine benutzerdefinierte Java 8 Sammler zu schreiben, die angeblich den Durchschnitt einer POJO zu berechnen, die eine getValue()
Methode hat. Hier ist der Code:Java 8 Stream Combiner genannt nie
public static Collector<BoltAggregationData, BigDecimal[], BigDecimal> avgCollector = new Collector<BoltAggregationData, BigDecimal[], BigDecimal>() {
@Override
public Supplier<BigDecimal[]> supplier() {
return() -> {
BigDecimal[] start = new BigDecimal[2];
start[0] = BigDecimal.ZERO;
start[1] = BigDecimal.ZERO;
return start;
};
}
@Override
public BiConsumer<BigDecimal[], BoltAggregationData> accumulator() {
return (a,b) -> {
a[0] = a[0].add(b.getValue());
a[1] = a[1].add(BigDecimal.ONE);
};
}
@Override
public BinaryOperator<BigDecimal[]> combiner() {
return (a,b) -> {
a[0] = a[0].add(b[0]);
a[1] = a[1].add(b[1]);
return a;
};
}
@Override
public Function<BigDecimal[], BigDecimal> finisher() {
return (a) -> {
return a[0].divide(a[1], 6 , RoundingMode.HALF_UP);
};
}
private final Set<Characteristics> CHARACTERISTICS = new HashSet<Characteristics>(Arrays.asList(Characteristics.CONCURRENT, Characteristics.UNORDERED));
@Override
public Set<Characteristics> characteristics() {
return CHARACTERISTICS;
}
};
Es funktioniert alles gut im nicht parallelen Fall. Wenn ich jedoch eine parallelStream()
verwende, funktioniert es manchmal nicht. Wenn man beispielsweise die Werte von 1 bis 10 berechnet, berechnet es (53/9 statt 55/10). Beim Debuggen trifft der Debugger niemals den Breakpoint in der Funktion combiner(). Gibt es eine Art Flagge, die ich setzen muss?
Ich habe beide upvote, vielen Dank für Ihre Antwort auch :) Ich habe gerade die andere Antwort irgendwie klarer. Danke auch für den Tipp zum EnumSet. –
Das ist ok, ich habe gerade bemerkt, dass Sie akzeptiert (oder versucht zu akzeptieren) in einem kurzen Zeitintervall beide, so wollte ich nur eine mögliche Verwirrung löschen. – Holger
Hinweis gibt es viel bessere Möglichkeiten, dies zu tun, zum Beispiel eines [kumulativen gleitenden Durchschnitt] (https://en.wikipedia.org/wiki/Moving_average). –