乐趣区

关于java:java7java8针对集合中对象的某一个字段分组

原文

java 8

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 的两种不同的分组形式

作者:H_Man
链接:https://www.jianshu.com/p/932…
起源:简书
著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。

退出移动版