将包含集合的映射转换为集合大小的映射

Tranforming a Map containing Sets into a Map of Set-Sizes

这是我的哈希图:

HashMap<Customer, HashSet<Car>> carsBoughtByCustomers = ...

我怎样才能得到一个新的HashMap,其中包含每个客户汽车数量,即尺寸HashSet?

我想这样做没有循环,但是只使用流

我的尝试:

HashMap<Customer, Integer> result = (HashMap<Customer, Integer>)
    carsBoughtByCustomers.entrySet().stream()
        .map(e -> e.getValue().size());

您需要申请 terminal operation in order to obtain a result from the stream, collect() in this case, which expects a Collector

map() - 是一个 中间操作 ,它会产生另一个流,即它旨在转换 stream-pipeline 但不会生成结果。因此,像这样的 myMap.entrySet().stream().map() 的 stream-statement 会导致 Stream,并且 不能 分配给 Map 类型的变量。

Map<Customer,Integer> result = carsBoughtByCustomers.entrySet().stream()
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                entry -> entry.getValue().size()
            ));

旁注:

  • 针对 MapSet 等接口编写代码,而不是 HashMapHashSet 等具体类型,使您的代码更加灵活。参见:What does it mean to "program to an interface"?
  • 没有终端操作的流是完全有效的,即它会编译(如果没有错误是代码),但不会被执行。