Java8 Stream流多字段求和、汇聚的实例

 更新时间:2022年05月06日 11:35:13   作者:我想写游戏  
这篇文章主要介绍了Java8 Stream流多字段求和、汇聚的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Stream流多字段求和、汇聚

实现方法

利用

Collectors.toMap(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().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一下,欢迎大神在评论区留下你的Stream骚操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java编程子类能否重写父类的静态方法探索

    Java编程子类能否重写父类的静态方法探索

    关于子类能否重写父类的静态方法,对像我这种初级的编程爱好者来说仍是值得讨论的一件事,下面我们通过具体实例,对此问题进行简单的探索。
    2017-10-10
  • 三步轻松搭建springMVC框架

    三步轻松搭建springMVC框架

    这篇文章主要教大家三步轻松搭建springMVC框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 使用Java实现5种负载均衡算法实例

    使用Java实现5种负载均衡算法实例

    负载均衡指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助,这篇文章主要给大家介绍了关于使用Java实现5种负载均衡算法的相关资料,需要的朋友可以参考下
    2021-09-09
  • 常见的java面试题

    常见的java面试题

    这篇文章主要为大家详细介绍了常见的java面试题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解

    查看JAVA字节码有两种方式一种是使用 jdk命令 javap,还有一种就是 使用 插件了,今天给大家分享IDEA中使用jclasslib插件可视化方式查看类字节码的过程详解,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • 使用SpringBoot项目导入openfeign版本的问题

    使用SpringBoot项目导入openfeign版本的问题

    这篇文章主要介绍了使用SpringBoot项目导入openfeign版本的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Springboot使用redis进行api防刷限流过程详解

    Springboot使用redis进行api防刷限流过程详解

    这篇文章主要介绍了Springboot使用redis进行api防刷限流过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java爬虫实战抓取一个网站上的全部链接

    Java爬虫实战抓取一个网站上的全部链接

    这篇文章主要介绍了JAVA使用爬虫抓取网站网页内容的方法,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧。
    2016-10-10
  • Java利用Selenium操作浏览器的示例详解

    Java利用Selenium操作浏览器的示例详解

    本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素等待,等待元素加载完,再操作,感兴趣的可以了解一下
    2023-01-01
  • MyBatis传入List集合查询数据问题

    MyBatis传入List集合查询数据问题

    这篇文章主要介绍了MyBatis传入List集合查询数据问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论