2 回答
TA貢獻1875條經(jīng)驗 獲得超3個贊
首先,如果您不使用多個線程(并行流),則不需要調(diào)用組合器函數(shù)。調(diào)用組合器以組合流塊上的操作結(jié)果。這里沒有并行性,因此不需要調(diào)用組合器。
由于您的累加器功能,您得到零值。表達方式
v += foo.v1 * foo.v2;
將替換 v為新Float對象。原來的累加器對象沒有被修改;它仍然是0f。此外,F(xiàn)loat與其他數(shù)字包裝器類型(和String)一樣,它是不可變的,無法更改。
您需要一些其他類型的可變累加器對象。
class FloatAcc {
private Float total;
public FloatAcc(Float initial) {
total = initial;
}
public void accumulate(Float item) {
total += item;
}
public Float get() {
return total;
}
}
然后您可以修改您的自定義Collector以使用FloatAcc. 提供一個新的,F(xiàn)loatAcc調(diào)用函數(shù)等。accumulateaccumulator
class FooCollector implements Collector<Foo, FloatAcc, Float> {
@Override
public Supplier<FloatAcc> supplier() {
return () -> new FloatAcc(0f);
}
@Override
public BiConsumer<FloatAcc, Foo> accumulator() {
return (v, foo) -> v.accumulate(foo.v1 * foo.v2);
}
@Override
public BinaryOperator<FloatAcc> combiner() {
return (v1, v2) -> {
v1.accumulate(v2.get());
return v1;
};
}
@Override
public Function<FloatAcc, Float> finisher() {
return FloatAcc::get;
}
@Override
public Set<Characteristics> characteristics() {
Set<Characteristics> characteristics = new TreeSet<>();
return characteristics;
}
}
通過這些更改,我得到了您所期望的:
{green=12.0, blue=10.0}
添加回答
舉報
