首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EnumMap & streams

EnumMap & streams
EN

Stack Overflow用户
提问于 2016-05-14 11:08:24
回答 1查看 9.9K关注 0票数 10

Hi试图找出如何映射到EnumMap,但没有成功。目前,我正在用两个步骤完成它,我创建了地图,然后我将它变成了一个EnumMap。问题是。

  1. 一步就能做到吗?
  2. 从效率的角度来看,最好从输入中获取值,使它们成为一个集合,然后流它,或者现在只使用toMap作为它的正确方法。谢谢 Map输入。Map ret = input.values() .stream().filter(品牌-> !brand.equals(CarBrand.BMW)) .collect(Function.identity(),toMap -> new CarsSellers(immutableCars,this.carsDb.export(品牌);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-14 11:15:18

TL;DR:您需要使用 method

默认情况下,toMap使用HashMap::new作为Supplier<Map> --您需要提供一个新的EnumMap

代码语言:javascript
复制
final Map<CarBrand, CarsSellers> ret = input.values()
        .stream()
        .filter(brand -> brand != CarBrand.BMW)
        .collect(toMap(
                identity(),
                brand -> new CarsSellers(immutableCars, this.carsDb.export(brand)),
                (l, r) -> {
                    throw new IllegalArgumentException("Duplicate keys " + l + "and " + r + ".");
                },
                () -> new EnumMap<>(CarBrand.class)));

论点如下:

  1. key萃取器
  2. value萃取器
  3. 一个"mergeFunction“,它需要两个值,一个已经存在于Map中,另一个要添加。在这种情况下,我们只是抛出一个IllegalArgumentException,因为键应该是唯一的。
  4. “地图供应商”-这将返回一个新的EnumMap

关于您的代码的说明:

  1. interface - Map而不是EnumMap的程序
  2. enum是单例的,所以您可以使用a != Enum.VALUE
  3. 用于import staticFunction.identity()使事情变得不那么冗长。
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37225879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档