流分组依据:减少到列表的第一个元素

2022-09-01 01:45:49

我有一个可以表示(简化)的JSON样式:List<Valuta>

[ { codice=EUR, description=Euro, ratio=1 }, { codice=USD, description=Dollars, ratio=1.1 } ]

我想把它转换成这样:Map<String, Valuta>

{ EUR={ codice=EUR, description=Euro, ratio=1 }, USD={ codice=USD, description=Dollars, ratio=1.1 }}

我写了这一行:

getValute().stream().collect(Collectors.groupingBy(Valuta::getCodice));

但这会返回一个而不是我需要的。Map<String, List<Valuta>>

我想函数对我有用,但不知道如何。mapping()


答案 1

实际上,您需要在此处使用而不是:Collectors.toMapCollectors.groupingBy

Map<String, Valuta> map = 
    getValute().stream()
               .collect(Collectors.toMap(Valuta::getCodice, Function.identity()));

分组By 用于根据分组函数对 Stream 的元素进行分组。默认情况下,将与分组函数具有相同结果的 2 个 Stream 元素将收集到 a 中。List

toMap 会将元素收集到 a 中,其中键是应用给定键映射器的结果,值是应用值映射器的结果。请注意,默认情况下,如果遇到重复项,将引发异常。MaptoMap


答案 2

在游戏中有点晚了,但试试这个:

Map<String, Valuta> map = 
    getValute().stream()
               .collect(Collectors.groupingBy(Valuta::getCodice,
                            Collectors.collectingAndThen(
                                Collectors.toList(), 
                                values -> values.get(0))));