java - 使用流按多个属性分组和排序:Java 8
问题描述
我有 MainEntity的列表
public class MainEntity {
private String keyword;
private double cost;
private String company;
}
我有CompanyEntity
public class CompanyEntity {
private double cost;
private String company;
}
我正在尝试将我的列表转换为 Map<String,List<CompanyEntity>>
关键所在的位置keyword
,List<CompanyEntity>
并将平均所有成本并进行排序。我正在尝试在流和 Java 8 中做到这一点。
对于作为输入的特定关键字,我正在这样做。
List<MainEntity> entityList = keyWordMap.get(entity.getKeyword());
entityList.add(entity);
keyWordMap.put(entity.getKeyword(), entityList);
Map<String, Double> average = (keyWordMap.get(keyword)).stream()
.collect(groupingBy(MainEntity::getCompany,
Collectors.averagingDouble(MainEntity::getCtr)));
result.put(keyword, new ArrayList<>());
for (Map.Entry<String, Double> entity : average.entrySet()) {
result.get(keyword).add(new CompanyEntity(entity.getKey(), entity.getValue()));
}
但我试图为所有关键字创建一个地图。是否有可能或再次迭代整个列表有意义?目前keyowordMap
是Map<String,MainEntity>
我通过迭代列表所做的类型MainEntity
,但我想要Map<String,List<MainEntity>>
。
解决方案
首先,制作一个keyWordMap
Map<String, List<MainEntity>> keyWordMap =
mainEntityList
.stream()
.collect(Collectors.groupingBy(MainEntity::getKeyword));
然后对map进行迭代,对于每个关键词,可以直接得到CompanyEntity
按平均值排序的list,并用map()
它来转换数据并收集为List,然后放入result
Map<String,List<CompanyEntity>> result = ....
for (Map.Entry<String, List<MainEntity> entry : keyWordMap.entrySet()) {
List<CompanyEntity> list = entry.getValue().stream()
.collect(groupingBy(MainEntity::getCompany,
Collectors.averagingDouble(MainEntity::getCtr)))
.entrySet()
.stream()
.sorted(Comparator.comparing(e -> e.getValue()))
.map(e -> new CompanyEntity(e.getKey(), e.getValue()))
.collect(Collectors.toList());
result.put(entry.getKey(), list);
}
或者你想一次性完成
Map<String,List<CompanyEntity>> mapData =
mainEntityList
.stream()
.collect(Collectors.groupingBy(MainEntity::getKeyWord,
Collectors.groupingBy(MainEntity::getCtr,
Collectors.averagingDouble(MainEntity::getCtr))))
.entrySet()
.stream()
.collect(Collectors.toMap(m -> m.getKey(),
m -> m.entrySet()
.stream()
.sorted(Comparator.comparing(e -> e.getValue()))
.map(e -> new CompanyEntity(e.getKey(), e.getValue()))
.collect(Collectors.toList())));
推荐阅读
- excel - 尝试向函数添加另一个条件
- node.js - Nodejs ffmpeg错误:输出流已关闭
- android-studio - org.jetbrains.kotlin.idea.caches.resolve.KotlinIdeaResolutionException Android Studio
- postgresql - 我可以在没有见证节点的情况下使用 EDB postgres 故障转移管理器 >
- backup - 我可以在 Synology 中删除 Hyper Backup 生成的 @img_bkp_cache 吗?
- java - VS 代码 Java CheckStyle 扩展没有响应
- vue.js - “[Vue 警告]:无法解析组件”动态加载
- compiler-construction - const 静态字段在评估后是否会从 AST 中删除?(优化)
- ruby - 无法在 centos 8 中安装 capybara-webkit
- flutter - 为什么 ListView 不能成为 Dialog 内颤动的 Column 布局的子项?