在批量处理数据的时候,想对一批数据(List<Object>
)分组操作咋办,有什么简便的方法吗?
准备一点数据:
public class User {
private Integer id;
private String type;
private String name;
private String date;
private BigDecimal money;
private Integer isOk;
public User(Integer id, String name, String type, String date, BigDecimal money, Integer isOk){
this.id = id;
this.type = type;
this.name = name;
this.date = date;
this.money = money;
this.isOk = isOk;
}
// omit setter and getter
@Override
public String toString() {
return "User{" +
"id=" + id +
", type='" + type + '\'' +
", name='" + name + '\'' +
", date='" + date + '\'' +
", money=" + money +
", isOk=" + isOk +
'}';
}
}
User user1 = new User(1,"张三","小学", "2017-03", BigDecimal.valueOf(123.44), 1);
User user2 = new User(2,"李四","小学", "2017-03", BigDecimal.valueOf(234.45), 0);
User user3 = new User(3,"王五","初中", "2017-02", BigDecimal.valueOf(234.12), 1);
User user4 = new User(4,"马六","高中", "2017-04", BigDecimal.valueOf(123), 0);
User user5= new User(5,"jack","大学", "2017-04", BigDecimal.valueOf(12), 0);
现在想对用户列表根据日期进行分组,得到一个map: date -> List<User>
,Java7以前也许是这样的:
List<User> userList = Arrays.asList(user1, user2, user3, user5, user4);
Map<String, List<User>> groupUserMap = Maps.newHashMap();
for (User user : userList) {
String month = user.getDate();
if (groupUserMap.containsKey(month)) {
groupUserMap.get(month).add(user);
} else {
groupUserMap.put(month, Lists.newArrayList(user));
}
}
可是有了Java8之后,一切似乎变简单了:
// one line
Map<String, List<User>> groupUserMapOne =userList.stream().collect(Collectors.groupingBy(User::getDate));
一行代码搞定。
如果想分组的List里是User的name呢:
// if you want a map: date -> user's names
Map<String, List<String>> userByDate = Stream.of(user1, user2, user3, user5, user4).collect(Collectors.groupingBy(User::getDate,
Collectors.mapping(User::getName, Collectors.toList())));
System.out.println(userByDate);
运行结果:
{2017-03=[张三, 李四], 2017-04=[jack, 马六], 2017-02=[王五]}
参考:
https://www.leveluplunch.com/java/tutorials/039-group-objects-by-field-java8/
https://www.mkyong.com/java8/java-8-collectors-groupingby-and-mapping-example/