从 Map 的 Java Stream 按键对它们进行分组,并找到未按预期工作的最大值

Jay*_*Jay 3 java java-8 java-stream

从输入中,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}
Run Code Online (Sandbox Code Playgroud)

我试过的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()))))
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 7

Collectors.maxBy()产生一个Optional,因为如果maxBy应用于一个空的Stream,它必须返回一个空的Optional

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

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));
Run Code Online (Sandbox Code Playgroud)

或者

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));
Run Code Online (Sandbox Code Playgroud)