Java对Collections进行分组

2 阅读1分钟

在批量处理数据的时候,想对一批数据(List)分组操作咋办,有什么简便的方法吗?

准备一点数据:

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,Java7以前也许是这样的:

List userList = Arrays.asList(user1, user2, user3, user5, user4); Map<String, List> 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> groupUserMapOne =userList.stream().collect(Collectors.groupingBy(User::getDate));

一行代码搞定。

如果想分组的List里是User的name呢:

// if you want a map: date -> user's names Map<String, List> 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=[王五]}

参考: www.leveluplunch.com/java/tutori… www.mkyong.com/java8/java-…