أنظف طريقة لإنشاء مولتيماب الجوافة من تيار جافا8 [مكررة]
-
20-12-2019 - |
سؤال
لدي List<Foo>
وتريد Multimap<String, Foo>
حيث قمنا بتجميع Foo
من قبلهم getId()
وظيفة.
أنا باستخدام جافا 8 ورهيبة تقريبا في ذلك يمكنك القيام به:
List<Foo> foos = ...
Map<String, List<Foo>> foosById = foos.stream().collect(groupingBy(Foo::getId));
ومع ذلك ، لدي كمية جيدة من التعليمات البرمجية التي تريد MultiMap<String, Foo>
لذلك هذا لا يوفر لي أي شيء وأنا مرة أخرى إلى استخدام لحلقة لخلق بلدي مولتيماب.هل هناك لطيفة "وظيفية" الطريقة التي أنا في عداد المفقودين?
المحلول
يمكنك فقط استخدام مصنع الجوافة متعدد الخرائط:
Multimaps.index(foos, Foo::getId);
أو التفاف مكالمة إلى مولتيمابس.فهرس بواجهة جامع (كما هو موضح أدناه ، في تنفيذ ساذج غير محسن).
Multimap<String, Foo> collect = foos.stream().collect(MultimapCollector.toMultimap(Foo::getId));
و جامع:
public class MultimapCollector<T, K, V> implements Collector<T, Multimap<K, V>, Multimap<K, V>> {
private final Function<T, K> keyGetter;
private final Function<T, V> valueGetter;
public MultimapCollector(Function<T, K> keyGetter, Function<T, V> valueGetter) {
this.keyGetter = keyGetter;
this.valueGetter = valueGetter;
}
public static <T, K, V> MultimapCollector<T, K, V> toMultimap(Function<T, K> keyGetter, Function<T, V> valueGetter) {
return new MultimapCollector<>(keyGetter, valueGetter);
}
public static <T, K, V> MultimapCollector<T, K, T> toMultimap(Function<T, K> keyGetter) {
return new MultimapCollector<>(keyGetter, v -> v);
}
@Override
public Supplier<Multimap<K, V>> supplier() {
return ArrayListMultimap::create;
}
@Override
public BiConsumer<Multimap<K, V>, T> accumulator() {
return (map, element) -> map.put(keyGetter.apply(element), valueGetter.apply(element));
}
@Override
public BinaryOperator<Multimap<K, V>> combiner() {
return (map1, map2) -> {
map1.putAll(map2);
return map1;
};
}
@Override
public Function<Multimap<K, V>, Multimap<K, V>> finisher() {
return map -> map;
}
@Override
public Set<Characteristics> characteristics() {
return ImmutableSet.of(Characteristics.IDENTITY_FINISH);
}
}
لا تنتمي إلى StackOverflow