項(xiàng)目中很多地方都會(huì)用到分組,提到分組,最簡(jiǎn)單的就是用java8的stream,但是有些條件下(比方說(shuō)我,今天)用的java7....fuck..
java8用起來(lái)比較方便
- 根據(jù)普通單個(gè)字段
//假設(shè)傳入一個(gè)非空訂單集合
List<BaseOrder> orderList;
//想要按照訂單號(hào)分組
Map<String, List<BaseOrder>> collect = orderList.stream()
.collect(Collectors.groupingBy(t -> t.getTradeNo()));
- 根據(jù)多個(gè)字段
//假設(shè)傳入一個(gè)非空訂單集合,想要根據(jù)訂單號(hào)和userId進(jìn)行分組
@Data
@AllArgsConstructor
@EqualsAndHashCode
class UserTrade{
private String userId;
private String tradeNo
}
List<BaseOrder> orderList;
//分組
Map<UserTrade, List<BaseOrder>> collect = orderList.stream().
collect(Collectors.groupingBy(new Function<BaseOrder, UserTrade>() {
@Override
public UserTrade apply(BaseOrder baseOrder) {
return new UserTrade(baseOrder.getUserId(), baseOrder.getTradeNo());
}
}));
java7
核心:核心用到的是guava的LinkedListMultimap類.此類可以針對(duì)單個(gè)key,放多個(gè)value,這些value會(huì)組成一個(gè)list
//假設(shè)傳入一個(gè)非空訂單集合,想要根據(jù)訂單號(hào)和userId進(jìn)行分組
@Data
@AllArgsConstructor
@EqualsAndHashCode
class UserTrade{
private String userId;
private String tradeNo
}
//分組
List<BaseOrder> orderList;
LinkedListMultimap<UserTrade, BaseOrder> multimap = LinkedListMultimap.create();
for(BaseOrder baseOrder:orderList){
multimap.put(new UserTrade(baseOrder.getUserId(),baseOrder.getTradeNo()),baseOrder);
}
List<BaseOrder> orders = multimap.get(new UserTrade("123","123"))
以上是基于java8和java7的兩種不同的分組方式