一:基于stream的集合分组
最记载做到一个统计功能,发现其中的集合分组的实现,让人头疼。传统的分组方式,基于集合的遍历按照条件意义分组。如下例所示。 基于年龄的分组其实真的挺烦,即使我们使用工厂模式的话,他的代码量至少一个判断。
List<User> userList=new ArrayList<>();
List<User> list = new ArrayList<>();
User user1 = new User("1", "u1", 15);
User user2 = new User("2", "u2", 15);
User user3 = new User("2", "u3", 15);
User user4 = new User("4", "u4", 16);
User user5 = new User("5", "u5", 16);
User user6 = new User("6", "u6", 16);
User user7 = new User("7", "u7", 16);
User user8 = new User("8", "u8", 17);
User user9 = new User("9", "u9", 17);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
list.add(user6);
list.add(user7);
list.add(user8);
list.add(user9);
//传统实现分组的方式(基于年龄)
for(User user:list) {
List<User> age15=new ArrayList<User>();
if(user.getAge() == 15 ) {
age15.add(user);
}
List<User> age16=new ArrayList<User>();
if(user.getAge() == 16 ) {
age16.add(user);
}
List<User> age17=new ArrayList<User>();
if(user.getAge() == 17 ) {
age17.add(user);
}
}
基于此我百度发现网上有这么一种集合分组的方式:基于java8的stream的新特性。
还是上述集合。但是分组方式做改变:
Map<Integer,List<User>> userGroupMap = list.stream().
collect(Collectors.groupingBy(User::getAge));
for(Map.Entry<Integer, List<User>> e:userGroupMap