3 回答

TA貢獻1821條經驗 獲得超5個贊
this is 沒有內置收集器JDK8,因此您的選擇是有限的:
使用toMap:
Map<String, Set<String>> resultSet =
products.stream()
.collect(toMap(Product::getName,
p -> new HashSet<>(p.getReviews()),
(l, r) -> {
l.addAll(r);
return l;
}));
或使用自定義收集器??吹竭@里,最后的代碼片段在這里
JDK9有flatMapping并且可以按如下方式使用:
要么這個:
Map<String, Set<String>> resultSet =
products.stream()
.collect(groupingBy(Product::getName,
mapping(Product::getReviews,
flatMapping(Collection::stream,
toSet()))));
或這個:
Map<String, Set<String>> resultSet =
products.stream()
.collect(groupingBy(Product::getName,
flatMapping(s -> s.getReviews().stream(),toSet())));

TA貢獻1842條經驗 獲得超13個贊
試試這個 。這會奏效。
假設您使用的是 java 8。
Map<String,Set<String>> reviewMap = products.stream().collect(Collectors.toMap(Product::getName,Product::getReviews));

TA貢獻1775條經驗 獲得超8個贊
您的代碼中的“產品”是什么?
我做了一個簡單的例子,其中 products 只是一個 arrayList,它可以像你想要的那樣工作。(我已經實現了一個“產品”類,所以它只是 p -> p
List<String> products = new ArrayList<>();
Map<String, Set<String>> productReviewMap = new HashMap<>();
final Map<String, Set<String>> collect = products.stream()
.collect(Collectors.groupingBy(p -> p, Collectors.mapping(p -> p, Collectors.toSet())));
添加回答
舉報