Java8?Stream流多字段求和、匯聚的實例
更新時間:2022年05月06日 11:35:13 作者:我想寫游戲
這篇文章主要介紹了Java8?Stream流多字段求和、匯聚的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
Stream流多字段求和、匯聚
實現方法
利用
Collectors.toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
keyMapper:代表你最終想要獲得的Map<Key, Value> 的KeyvalueMapper:代表你最終想要獲得的Map<Key, Value> 的ValuemergeFunction:表示碰到Key沖突是處理過程,{x, y}中x是已匯聚對象,y表示當前處理對象
對象類型數據處理
public static Map<String, Model> streamGroupSum(List<Model> datas){
? ? return datas.stream().collect(Collectors.toMap(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.code = code;
this.sum1 = sum1;
this.sum2 = sum2;
}
public Model addCount(){
this.count++;
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()
.collect(Collectors.toMap(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 (Object... 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;
}
Stream分組求和使用筆記
話不多說,直接貼代碼,分組使用
class Foo {
? ? private int code;
? ? private int count;
? ? public Foo(int code, int count) {
? ? ? ? this.code = code;
? ? ? ? this.count = count;
? ? }
? ? public int getCode() {
? ? ? ? return code;
? ? }
? ? public void setCode(int code) {
? ? ? ? this.code = code;
? ? }
? ? public int getCount() {
? ? ? ? return count;
? ? }
? ? public void setCount(int count) {
? ? ? ? this.count = count;
? ? }
}
public static void main(String[] args) {
? ? ? ? Foo foo1 = new Foo(1, 2);
? ? ? ? Foo foo2 = new Foo(2, 23);
? ? ? ? Foo foo3 = new Foo(2, 6);
? ? ? ? List<Foo> list = new ArrayList<>(4);
? ? ? ? list.add(foo1);
? ? ? ? list.add(foo2);
? ? ? ? list.add(foo3);
? ? ? ? Map<Integer, List<Foo>> collect = list.stream().collect(Collectors.groupingBy(Foo::getCode));
? ? ? ? List<Foo> list1 = collect.get(1);
? ? ? ? List<Foo> list2 = collect.get(2);
? ? ? ? list1.forEach(e -> System.out.println(e.getCode() + ":" + e.getCount()));
? ? ? ? System.out.println("-----------這里是分界線-----------------------------");
? ? ? ? list2.forEach(e -> System.out.println(e.getCode() + ":" + e.getCount()));
? ? }輸出結果:
1:2
-----------這里是分界線-----------------------------
2:23
2:6
分組求和使用
public static void main(String[] args) {
? ? ? ? Foo foo1 = new Foo(1, 2);
? ? ? ? Foo foo2 = new Foo(2, 23);
? ? ? ? Foo foo3 = new Foo(2, 6);
? ? ? ? List<Foo> list = new ArrayList<>(4);
? ? ? ? list.add(foo1);
? ? ? ? list.add(foo2);
? ? ? ? list.add(foo3);
? ? ? ? Map<Integer, IntSummaryStatistics> collect = list.stream().collect(Collectors.groupingBy(Foo::getCode, Collectors.summarizingInt(Foo::getCount)));
? ? ? ? IntSummaryStatistics statistics1 = collect.get(1);
? ? ? ? IntSummaryStatistics statistics2 = collect.get(2);
? ? ? ? System.out.println(statistics1.getSum());
? ? ? ? System.out.println(statistics1.getAverage());
? ? ? ? System.out.println(statistics1.getMax());
? ? ? ? System.out.println(statistics1.getMin());
? ? ? ? System.out.println(statistics1.getCount());
? ? ? ? System.out.println(statistics2.getSum());
? ? ? ? System.out.println(statistics2.getAverage());
? ? ? ? System.out.println(statistics2.getMax());
? ? ? ? System.out.println(statistics2.getMin());
? ? ? ? System.out.println(statistics2.getCount());
? ? }輸出結果:
2
2.0
2
2
1
29
14.5
23
6
2
stream真的是相當的好用,Mark一下,歡迎大神在評論區(qū)留下你的Stream騷操作。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot啟動時自動執(zhí)行代碼的幾種實現方式
這篇文章主要給大家介紹了關于SpringBoot啟動時自動執(zhí)行代碼的幾種實現方式,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-02-02
Springboot使用RabbitMQ實現關閉超時訂單(示例詳解)
介紹了如何在Spring Boot項目中使用RabbitMQ實現訂單的延時處理和超時關閉,通過配置RabbitMQ的交換機、隊列和綁定關系,以及編寫監(jiān)聽方法,實現了訂單數據的發(fā)送和延時消費,感興趣的朋友一起看看吧2025-01-01
基于SpringBoot?使用?Flink?收發(fā)Kafka消息的示例詳解
這篇文章主要介紹了基于SpringBoot?使用?Flink?收發(fā)Kafka消息,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01

