أنظف طريقة لإنشاء مولتيماب الجوافة من تيار جافا8 [مكررة]

StackOverflow https://stackoverflow.com//questions/23003542

  •  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);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top