因此,可能有一个abc用于多个付款,现在我有:
//find abc id for each payment id
Map<Long, Integer> abcIdToPmtId = paymentController.findPaymentsByIds(pmtIds)
.stream()
.collect(Collectors.toMap(Payment::getAbcId, Payment::getPaymentId));但是后来我意识到这个可能有重复的键,所以我希望它返回一个
Map<Long, List<Integer>> abcIdToPmtIds 其中一个条目将包含一个abc和他的多个付款。
我知道我可以使用groupingBy,但是我想我只能使用Map<Long, List<Payments>>。
发布于 2018-02-07 02:23:04
使用另一个groupingBy重载。
paymentController.findPaymentsByIds(pmtIds)
.stream()
.collect(
groupingBy(Payment::getAbcId, mapping(Payment::getPaymentId, toList());发布于 2019-02-09 06:58:07
问题陈述:正在转换SimpleImmutableEntry<String, List<String>> -> Map<String, List<String>>。
例如,您有一个形式为[A,1],[B, 2 ],[A,3]的SimpleImmutableEntry,您希望您的地图看起来像这样:A -> 1,3,B -> 2。
这可以使用Collectors.toMap来完成,但是Collectors.toMap只能使用唯一键,除非您提供合并功能来解决java文档中所说的冲突。
因此,示例代码如下所示:
.map(returnSimpleImmutableEntries)
.collect(Collectors.toMap(SimpleImmutableEntry::getKey,
SimpleImmutableEntry::getValue,
(oldList, newList) -> { oldList.addAll(newList); return oldList; } ));returnSimpleImmutableEntries方法返回[A,1]、[B,2]、[A,3]形式的条目,您可以在这些条目上使用收集器。
发布于 2018-02-07 02:26:33
使用Collectors.toMap
Map<Long, Integer> abcIdToPmtId = paymentController.findPaymentsByIds(pmtIds)
.stream()
.collect(Collectors.toMap(
Payment::getAbcId,
p -> new ArrayList<>(Arrays.asList(p.getPaymentId())),
(o, n) -> { o.addAll(n); return o; }));尽管与Collectors.mapping一起使用Collectors.groupingBy更清晰、更具可读性。
不过,你不需要streams来做到这一点:
Map<Long, Integer> abcIdToPmtId = new HashMap<>();
paymentController.findPaymentsByIds(pmtIds).forEach(p ->
abcIdToPmtId.computeIfAbsent(
p.getAbcId(),
k -> new ArrayList<>())
.add(p.getPaymentId()));https://stackoverflow.com/questions/48649513
复制相似问题