Java 杂谈java专题

java7&java8针对集合中对象的某一个字段分组

2019-02-20  本文已影响1人  H_Man

项目中很多地方都会用到分组,提到分组,最简单的就是用java8的stream,但是有些条件下(比方说我,今天)用的java7....fuck..

java8用起来比较方便
//假设传入一个非空订单集合
List<BaseOrder> orderList;

//想要按照订单号分组
Map<String, List<BaseOrder>> collect = orderList.stream()
        .collect(Collectors.groupingBy(t -> t.getTradeNo()));



//假设传入一个非空订单集合,想要根据订单号和userId进行分组
@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类.此类可以针对单个key,放多个value,这些value会组成一个list

//假设传入一个非空订单集合,想要根据订单号和userId进行分组
@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的两种不同的分组方式

上一篇 下一篇

猜你喜欢

热点阅读