当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《流分组:减少到列表的第一个元素》经验,为你挑选了3个好方法。

我有一个List可以表示(简化)JSON风格:

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

我想用这样的方式改变它Map:

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

我写了这个单行:

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

但这会返回一个Map>而不是我需要的东西.

我认为mapping()功能对我有用,但不知道如何.



1> Tunaki..:

实际上,你需要在Collectors.toMap这里使用而不是Collectors.groupingBy:

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

groupingBy用于根据分组功能对Stream的元素进行分组.2 List默认情况下,将与分组功能具有相同结果的流元素收集到a中.

toMap将元素收集到Map键是应用给定键映射器的结果的位置,值是应用值映射器的结果.请注意toMap,默认情况下,如果遇到重复,则会抛出异常.


怎样对`groupingBy`做同样的事情?我不能使用`toMap`,因为我必须期待键映射器中重复的键。我看到`groupingBy`具有下游收集器的签名作为第二个参数,但是还不能使它起作用。

2> Philippe..:

这场比赛有点晚了,但试试这个:

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


如果您确实有重复项,但又不想使用它,这就是需要的

3> Pshemo..:

你可以用 Collectors.toMap(keyMappingFunction, valueMappingFunction)

Map map = list
        .stream()
        .collect(Collectors.toMap(Valuta::getCodice, v -> v));

如果您发现它更具可读性v->v,Function.identity()则可以替换.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有