Java8Stream流多字段求和、汇聚Stream 多字段求和、汇聚
实现⽅法
利⽤Map(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) keyMapper:代表你最终想要获得的Map<Key, Value> 的Key
valueMapper:代表你最终想要获得的Map<Key, Value> 的Value
mergeFunction:表⽰碰到Key冲突是处理过程,{x, y}中x是已汇聚对象,y表⽰当前处理对象
对象类型数据处理
public static Map<String, Model>streamGroupSum(List<Model> datas){
return datas.stream().Map(k -> k.getCode(), v -> v,(x, y)-> x.addCount().addAll(y)));
}
Model
@Data
class Model{
private String code;
private int count =0;
private Integer sum1;
private Integer sum2;
public Model(String code, Integer sum1, Integer sum2){
this.sum1 = sum1;java stream
this.sum2 = sum2;
}
public Model addCount(){
return this;
}
public Model addAll(Model y){
return add(Model::setSum1, Model::getSum1, y)
.add(Model::setSum2, Model::getSum2, y);
}
/**
* 使⽤函数式编程,最终⽬的是为了求和,类似反射,具体使⽤⽅式请移步函数式编程
*/
public Model add(BiConsumer<Model, Integer> set, Function<Model, Integer> get, Model y){
set.accept(this, get.apply(this)+ get.apply(y));
return this;
}
}
Map类型数据处理
public static void main (String[] args){
List<Map<String, Object>> datas =getDatas();
streamMapSum(datas);
}
public static Map<Object, Map<String, Object>> streamMapSum (List<Map<String, Object>> datas){ return datas.stream()
.Map(k -> k.get("name"), v ->{
v.put("count",1);
return v;
}
,(x, y)->{
x.put("count",(int) x.get("count")+1);
x.put("aaa",(int) x.get("aaa")+(int) y.get("aaa"));
x.put("bbb",(int) x.get("bbb")+(int) y.get("bbb"));
x.put("ccc",(int) x.get("ccc")+(int) y.get("ccc"));
return x;
/*
//使⽤ofMap重构
return ofMap("name", x.get("name")
, "count", (int) x.get("count") + 1
, "aaa", add(x, y, "aaa")
, "bbb", add(x, y, "bbb")
, "ccc", add(x, y, "ccc"));*/
}
)
);
}
public static int add (Map<String, Object> x, Map<String, Object> y, String key){
return(int) x.get(key)+(int) y.get(key);
}
public static Map<String, Object> ofMap ( objs){
System.out.println("ofMap");
Map<String, Object> map =new LinkedHashMap<>();
for(int i =0; i < objs.length; i = i +2){
map.put(objs[i].toString(), objs[i +1]);
}
return map;
}
public static List<Map<String, Object>> getDatas (){
List<Map<String, Object>> list =new ArrayList<>();
list.add(ofMap("name","张三","aaa",3,"bbb",5,"ccc",6));
list.add(ofMap("name","张三","aaa",8,"bbb",51,"ccc",521));
list.add(ofMap("name","李四","aaa",9,"bbb",53,"ccc",23));
return list;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。