首页 > 其他分享 >你可能不知道的Collectors用法

你可能不知道的Collectors用法

时间:2023-03-27 20:58:53浏览次数:49  
标签:Collectors stream userList age 用法 collect User 知道

1.0、初始化数据

伪代码

User a1 = User.builder().age(2).name("A").build();
User a = User.builder().age(1).name("A").build();
User b = User.builder().age(2).name("B").build();
User c = User.builder().age(3).name("C").build();
User d = User.builder().age(4).name("D").build();

List<User> userList = Lists.newArrayList(a1,a,b, c, d);

User flatUser1 = User.builder().age(4).name("as,df,gh").build();
User flatUser2 = User.builder().age(4).name("gh,jk").build();
List<User> flatUserList = Lists.newArrayList(flatUser1,flatUser2);

1.1、toMap

key值相同时的策略

//k1和k2重复,返回k2
Map<String, User> collectK2 = userList.stream().collect(Collectors.toMap(User::getName, Function.identity(), (k1, k2) -> k2));
//按照自定义条件返回key,例如按照最大age返回key
Map<String, User> collectMax = userList.stream().collect(Collectors.toMap(User::getName, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(User::getAge))));

1.2、flatMap

map 的输入和输出是 1:1

flatMap的输入和输出是 1:N

//map 的输入和输出是 1:1
//如果直接用map取值,则输出 [[Ljava.lang.String;@2a2d45ba, [Ljava.lang.String;@2a5ca609]
flatUserList.stream().map(var -> var.getName().split(",")).collect(Collectors.toList());
//使用flatMap 则输出 [as, df, gh, jk]
//flatMap的输入和输出是 1:N
flatUserList.stream().map(var->var.getName().split(",")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());

1.3、groupingBy

分组策略-分组字段重复时取值逻辑

//默认value是list
userList.stream().collect(Collectors.groupingBy(User::getName));
//指定value返回类型
userList.stream().collect(Collectors.groupingBy(User::getName,Collectors.toSet()));
//分组策略-保留age最大的那一条
userList.stream().collect(Collectors.groupingBy(User::getName, Collectors.maxBy(Comparator.comparing(User::getAge))));
//分组策略-保留age最小的那一条
userList.stream().collect(Collectors.groupingBy(User::getName, Collectors.minBy(Comparator.comparing(User::getAge))));

1.4、collectingAndThen

对象集合去重

//name属性去重
userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))), ArrayList::new));
//name和age去重
userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->new TreeSet<>(Comparator.comparing(user -> user.getName()+ "-" + user.getAge()))), ArrayList::new));

1.5、maxBy/minBy

取最大最小值

// 最大、最小age
userList.stream().collect(Collectors.maxBy(Comparator.comparing(User::getAge)));
userList.stream().collect(Collectors.minBy(Comparator.comparing(User::getAge)));

1.6、reduce

累加求和

// reduce、reducing、summingInt 效果一样
userList.stream().map(User::getAge).reduce(0, (x, y) -> x + y));
userList.stream().map(User::getAge).collect(Collectors.reducing(0,Integer::sum));
userList.stream().map(User::getAge).collect(Collectors.summingInt(Integer::intValue));

标签:Collectors,stream,userList,age,用法,collect,User,知道
From: https://www.cnblogs.com/geekdc/p/17262814.html

相关文章

  • 多线程 wait() notify的用法
    main类 packageendual;publicclassMainApp{ publicstaticvoidmain(String[]args){ Queryq=newQuery(0); Threadthread=newThread(newThrea......
  • Python:str.casefold()的用法
    casefold()是Python中字符串对象的一个方法,用于将字符串中的所有字母字符转换为小写,并处理某些特殊字符(如特定语言的重音符号)以确保正确的比较。与lower()方法不同的......
  • WordPress 数据库操作WPDB对象($wpdb)用法详解
     使用wordpress的时候,如果想直接使用WP里封装的数据库操作的类(wp-db.php),将wp-blog-header.php包含到代码中就可以使用了。define(‘PATH’,dirname(dirname(__FILE__......
  • 哥终于知道了苹果为什么发布的是iPhone 4S而非iPhone 5
    当得知上周苹果发布的是iPhone4S而不是iPhone5时,哥顿感失望。哥当时就想,假如苹果发布的是iPhone5而不是iPhone4S的话,销量一定会比现在更好。如果苹果推出一款全新的iP......
  • python中的venv文件夹用途和用法
    一Venv文件夹是干嘛的:在pytest中,venv文件夹通常用来存储Python的虚拟环境。虚拟环境是一种隔离Python环境的机制,可以让我们在同一台机器上运行多个Python项目,并......
  • C#多态性学习,虚方法、抽象方法、接口等用法举例
    1.多态性定义  C#中的多态性是OOP(面向对象编程)的一个基本概念,它允许一个对象在不同情况下表现出不同的行为,以增强代码的可重用性和灵活性。  根据网上的教程,我们得......
  • DWG图纸可以直接导入3D,你知道吗?
    在日常工作中,设计工程师经常会使用浩辰CAD、浩辰CAD建筑等二维制图软件来进行创意设计,因而企业内部可能累积了大量的DWG图纸。近年来,随着3D设计软件逐渐兴起,越来越多的企业......
  • 五种Python中字典的高级用法
    用作switch/case在许多编程语言中,switch/case语句允许大家根据变量的值来执行不同的操作。虽然Python没有内置的switch/case语句,但是大家可以通过使用字典来实现类似的功......
  • C# StackExchange.Redis 用法总结
    阅读目录安装 StackExchange.Redis引用及初始化String(字符串)List(列表)Hash(哈希)发布订阅事务Batch批量操作Lock(分布式锁)StackExchange.Redis封装安装 St......
  • C++ stringstream ssin 的用法
    C++中stringstream方法存在于头文件<sstream>中作用:使用stringstream方法,将某一字符串生成输入流,然后可以利用这个输入流把长的整行字符串转换成单个字符#include......