可以將值簡單地按futureLinkId
然後映射到id
。一種方式把它寫:
Map<String, List<String>> result = Stream.of(new Placement("id1", "f1"), new Placement("id2", "f1"))
.collect(Collectors.groupingBy(Placement::getFutureLinkId))
.entrySet()
.stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream().map(Placement::getId).collect(Collectors.toList())));
System.out.println(result);
輸出:
{f1=[id1, id2]}
爲了使它看起來更好,我建議寫兩個幫手:
public static <K, V, N> Map<K, N> mapValues(Map<K, V> map, Function<V, N> mapper) {
return map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, mapper.compose(Map.Entry::getValue)));
}
public static <T, R> List<R> map(List<T> list, Function<T, R> mapper) {
return list.stream().map(mapper).collect(toList());
}
然後
Map<String, List<String>> result = Stream.of(new Placement("id1", "f1"), new Placement("id2", "f1")).collect(
collectingAndThen(groupingBy(Placement::getFutureLinkId),
res -> mapValues(res, list -> map(list, Placement::getId))));
System.out.println(result);
什麼'地圖{F1 - {ID1,ID2}}'是什麼意思? Java中的'Map'需要有一個鍵類型,這裏是'String',和一個值類型,你不會告訴我們。 – ajb
無論如何,解決方案可能會涉及使用[此方法](http://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util。 function.Function-java.util.function.Function-java.util.function.BinaryOperator-)。 – ajb
數據類型字符串@ajb f1是Map的關鍵字,值爲字符串集合是具有相同未來鏈接ID的展示位置的ID,在本示例中爲f1。 – San82