Java8之stream流的分组排序
关于Java8的stream流,这⾥不讲groupBy分组,也不讲sort排序,这些都是很基础的⽤法,可以⾃⾏百度。
这⾥说⼀种业务场景,对于分组后的map,根据value对key-value进⾏排序。举个例⼦,⼈(姓名,地址,创建时间)的集合,要求按地址将他们分组,同时要求越晚被创建的⼈,所在的分组越靠前。
直接上People类:
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class People {
private String name;
private String address;
private Long createTime;
}
然后是分组排序代码:
public static void main(String[] args) {
long time = 1L;
List<People> list = new ArrayList<>();
java集合排序怎么实现
list.add(new People("曹丕", "魏", time++));
list.add(new People("关⽻", "蜀", time++));
list.add(new People("刘备", "蜀", time++));
list.add(new People("⼩乔", "吴", time++));
list.add(new People("周瑜", "吴", time++));
list.add(new People("曹操", "魏", time++));
Map<String, List<People>> collect = list.stream()
.filter(d -> d != null && d.getAddress() != null) // 这⾥是为了下⾯分组的key不为null,要是key为null会报错的
.sorted(ComparatorparingLong(People::getCreateTime).reversed())
.upingBy(People::getAddress, LinkedHashMap::new, List()));
for (Map.Entry<String, List<People>> entry : Set()) {
System.out.Key() + "\t" + Value());
}
}
最后是运⾏结果:
魏 [People(name=曹操, address=魏, createTime=6), People(name=曹丕, address=魏, createTime=1)]
吴 [People(name=周瑜, address=吴, createTime=5), People(name=⼩乔, address=吴, createTime=4)]
蜀 [People(name=刘备, address=蜀, createTime=3), People(name=关⽻, address=蜀, createTime=2)]
那么如果按照题⽬要求,这个时候,我再加个“蜀国”⼈,那么这个⼈所在分组就应该放到第⼀的位置
long time = 1L;
List<People> list = new ArrayList<>();
list.add(new People("曹丕", "魏", time++));
list.add(new People("关⽻", "蜀", time++));
list.add(new People("刘备", "蜀", time++));
list.add(new People("⼩乔", "吴", time++));
list.add(new People("周瑜", "吴", time++));
list.add(new People("曹操", "魏", time++));
list.add(new People("张飞", "蜀", time++));
运⾏后结果如下,发现最后添加的“张飞”所在的“蜀”分类,已经放到了第⼀的位置: