stream(流) 分组
数据
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// 名字
private String name;
// 年龄
private Integer age;
// 性别
private String sex;
}
List<User> users= new ArrayList();
users.add(new User("张1", 12, "男"));
users.add(new User("张2", 20, "女"));
users.add(new User("张3", 18, "男"));
users.add(new User("张4", 24, "女"));
users.add(new User("张5", 16, "男"));
1、根据属性进行分组
Map<String, List<User>> sexAndUserMap = users.parallelStream()
.collect(Collectors.groupingBy(User::getSex));
2、根据sex属性分组统计age属性List(Set)
根据性别分组统计名称 List
Map<String, List<String>> map = users.parallelStream()
.collect(Collectors.groupingBy(User::getSex, Collectors.mapping(User::getAge, Collectors.toList())));
根据性别分组统计名称 Set
Map<String, Set<String>> map = users.parallelStream().collect(Collectors.groupingBy(User::getSex, Collectors.mapping(User::getName, Collectors.toSet())));
3、根据sex属性分组统计name属性和对象本身
根据sex分组统计name以及用户本身
Map<String, Map<String, User>> sexAndNameAndDataMap = users.parallelStream()
.collect(Collectors.groupingBy(User::getSex, Collectors.toMap(User::getName, data -> data)));
4、多级分组,根据sex属性分组,在这个基础上按naem属性分组
必须保证name在各sex组下是唯一的,否则会产生用户覆盖。
Map<String, Map<String, List<User>>> SexAndNameAndUserListMap = users.parallelStream()
.collect(Collectors.groupingBy(User::getSex, Collectors.groupingBy(User::getNaem)));
5、遍历对象拿naem和sex属性建立Map映射关系
name必须唯一,否则会出现sex属性值覆盖的情况
Map<String, String> nameAndSexMap = users.parallelStream().collect(Collectors.toMap(User::getName, User::getSex));
字符分组
Map<Character, List<Character>> msgCollect = msgList.stream().collect(Collectors.groupingBy(Character::charValue));