将包含集合的映射转换为集合大小的映射
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()
));
旁注:
- 针对
Map
和 Set
等接口编写代码,而不是 HashMap
和 HashSet
等具体类型,使您的代码更加灵活。参见:What does it mean to "program to an interface"?
- 没有终端操作的流是完全有效的,即它会编译(如果没有错误是代码),但不会被执行。
这是我的哈希图:
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()
));
旁注:
- 针对
Map
和Set
等接口编写代码,而不是HashMap
和HashSet
等具体类型,使您的代码更加灵活。参见:What does it mean to "program to an interface"? - 没有终端操作的流是完全有效的,即它会编译(如果没有错误是代码),但不会被执行。