Java 8映射列表按键映射列表

ale*_*oid -4 java java-8 java-stream

我有以下Java代码:

List<BaseQuery> queries; 

Map<Long, List<BaseQuery>> map = new HashMap<>();
for (BaseQuery query : queries) {
    List<BaseQuery> queryList = map.get(query.getCharacteristicId());
    if(queryList == null) {
        queryList = new ArrayList<>();
        map.put(query.getCharacteristicId(), queryList);
    }
    queryList.add(query);
}
Run Code Online (Sandbox Code Playgroud)

能否请您展示如何将其转换为Java 8和流?

Eug*_*ene 10

它很简单groupingBy:

queries.stream()
       .collect(Collectors.groupingBy(BaseQuery::getCharacteristicId));
Run Code Online (Sandbox Code Playgroud)

这将创建一个List<BaseQuery>as值,它隐含地:

queries.stream()
       .collect(Collectors.groupingBy(
            BaseQuery::getCharacteristicId,
            Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

但是如果你想要保证一个可变的List:

queries.stream()
       .collect(Collectors.groupingBy(
            BaseQuery::getCharacteristicId,
            Collectors.toCollection(ArrayList::new)));
Run Code Online (Sandbox Code Playgroud)