Java 8 Collector для Guava's ImmutableListMultimap <String, T>

Ищете простой способ собрать коллекцию KeyAndValues having fields - String and List<T>в ImmutableListMultimap<String,T>? Пытался что-то сделать,

 Collector.of(
          ImmutableListMultimap.Builder::new,
          ImmutableListMultimap.Builder<String,List<T>>::putAll,
          (b1, b2) -> b1.putAll(b2.build()),
          (builder) -> builder.build());

putAllпринимает Key, List<T>. Я не уверен, как добиться этого в объединителе.

РЕДАКТИРОВАТЬ :

 @Value(staticConstructor = "of")
 private static class KeyAndValues<T> {

    private final String key;
    private final List<T> values;
}

java,java-8,guava,collectors,

0

Ответов: 1


5 принят

Не уверен в доступных методах KeyAndValues<T>, но как насчет этого?

  public static <T> Collector<KeyAndValues<T>,
                              ImmutableListMultimap.Builder<String, T>, 
                              ImmutableListMultimap<String, T>> toImmutableMultimap()
  {
    return Collector.of(
        ImmutableListMultimap.Builder::new,
        (b, kav) -> b.putAll(kav.getKey(), kav.getValues()),
        (builder1, builder2) -> builder1.putAll(builder2.build()),
        (builder) -> builder.build());
  }

Кроме того, если вы предпочитаете скрывать детали аккумулятора, вы можете использовать что-то вроде этого:

public static <T> Collector<KeyAndValues<T>,
                            ?,
                            ImmutableListMultimap<String, T>> toImmutableMultimap()
{
  return Collector.of(
    ImmutableListMultimap.Builder<String, T>::new,
    (b, kav) -> b.putAll(kav.getKey(), kav.getValues()),
    (builder1, builder2) -> builder1.putAll(builder2.build()),
    (builder) -> builder.build());
}
Java, Java-8, гуавы, коллекторы,
Похожие вопросы