Stream API, Collector. , , :
Obj
public class Obj {
String year;
Long membercount;
Long nonmembercount;
Double memberpayment;
Double nonmemberpayment;
public Obj(String year, long membercount, long nonmembercount,
double memberpayment, double nonmemberpayment) {
this.year = year;
this.membercount = membercount;
this.nonmembercount = nonmembercount;
this.memberpayment = memberpayment;
this.nonmemberpayment = nonmemberpayment;
}
@Override
public String toString() {
return "Obj("+year+", "+membercount+", "+nonmembercount
+", "+memberpayment+", "+nonmemberpayment+')';
}
}
:
List<Obj> list=Arrays.asList(
new Obj("9-2015", 100, 20, 10, 5),
new Obj("10-2015", 220, 40, 20, 55),
new Obj("11-2015", 300, 60, 30, 45),
new Obj("12-2015", 330, 30, 50, 6),
new Obj("1-2016", 100, 10, 10, 4));
Obj[] array = list.toArray(new Obj[0]);
Arrays.parallelPrefix(array, (a,b) -> new Obj(b.year,
a.membercount + b.membercount,
a.nonmembercount + b.nonmembercount,
a.memberpayment + b.memberpayment,
a.nonmemberpayment + b.nonmemberpayment
));
Arrays.asList(array).forEach(System.out::println);
Obj(9-2015, 100, 20, 10.0, 5.0)
Obj(10-2015, 320, 60, 30.0, 60.0)
Obj(11-2015, 620, 120, 60.0, 105.0)
Obj(12-2015, 950, 150, 110.0, 111.0)
Obj(1-2016, 1050, 160, 120.0, 115.0)
, , . , ...
, . Arrays.parallelPrefix, , , .
public static <T> Collector<T,?,List<T>> cumulative(BinaryOperator<T> update) {
return Collector.of(ArrayList::new,
(l,o) -> {
if(!l.isEmpty()) o=update.apply(l.get(l.size()-1), o);
l.add(o);
},
(l,m) -> {
if(l.isEmpty()) return m;
if(!m.isEmpty()) {
T a = l.get(l.size()-1);
for(T b: m) l.add(update.apply(a, b));
}
return l;
});
}
, :
List<Obj> result = list.stream().collect(cumulative((a,b) -> new Obj(b.year,
a.membercount + b.membercount,
a.nonmembercount + b.nonmembercount,
a.memberpayment + b.memberpayment,
a.nonmemberpayment + b.nonmemberpayment
)));