从Map的Java流中,通过键对它们进行分组,并找到最大值无法正常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Map的Java流中,通过键对它们进行分组,并找到最大值无法正常工作相关的知识,希望对你有一定的参考价值。

从输入Stream<Map<String,Float>中,我试图找到唯一的分析物,并且该分析物具有最大值。我尝试了以下方法,但未获得预期的结果。我在收集价值时犯了一些错误。

样本输入数据:List<Map<String,Float>

HNO3=2.005
HNO3=2.009
HCl=10.2
F-=0.0, HNO3=50.0

Actual result   : HCl=Optional[HCl=10.2], F-=Optional[F-=0.0], HNO3=Optional[HNO3=50.0]
Expected result : HCl=10.2, F-=0.0, HNO3=50.0

我尝试过的Java代码:-

finalResponse.getChosenStartingMaterials()
    .stream()
    .map(Analyte::getMatrixUtilisationMap)  // Stream<Map<String,Float>>
    .flatMap(it -> it.entrySet().stream())   
    .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.maxBy((m1, m2) -> m1.getValue().compareTo(m2.getValue()))))
答案
[Collectors.maxBy()产生Optional,因为如果将maxBy应用于空的Stream,则它必须返回空的Optional

您可以使用Collectors.toMap代替Collectors.groupingBy来避免Optional

finalResponse.getChosenStartingMaterials() .stream() .map(Analyte::getMatrixUtilisationMap) // Stream<Map<String,Float>> .flatMap(it -> it.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1.compareTo(v2) >= 0 ? v1 : v2));

finalResponse.getChosenStartingMaterials() .stream() .map(Analyte::getMatrixUtilisationMap) // Stream<Map<String,Float>> .flatMap(it -> it.entrySet().stream()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Float::max));

以上是关于从Map的Java流中,通过键对它们进行分组,并找到最大值无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Array.reduce() 通过多个键对数组进行分组

按数组中的多个属性对对象进行分组,然后将它们的值相加

根据php中的键对数组值进行分组?

基于多个键对 Json 进行分组

通过键对元组进行归约和求和

使用 std::string 作为字典顺序的键对 unordered_map 进行排序