Java Streams: расширение встроенного коллектора - PullRequest
3 голосов
/ 17 января 2020

Я хотел бы знать, возможно ли расширить встроенный Java потоковый сборщик из класса java.util.stream.Collectors, в отличие от создания собственного сборщика с нуля, и, следовательно, дублирования кода, уже реализованного в этом класс.

Например: допустим, у меня есть Stream<Map.Entry<String, Long>> mapEntryStream, и я хочу собрать это на карту типа Map<String, Long>.

Конечно, я мог бы сделать:

mapEntryStream.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Но, скажем, я хотел бы, чтобы ключи и записи выводились следующим образом:

//Not a real Java Collectors method
mapEntryStream.collect(Collectors.toMap());

Итак, как мне сделать коллектор, подобный приведенному выше, который не принимает аргументов, но вызывает Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)?

Обратите внимание: это не вопрос о том, должен ли такой сборщик быть выполнен - ​​только если он может быть сделано.

1 Ответ

2 голосов
/ 17 января 2020

Вы не можете добавить метод к классу Collectors. Однако вы можете создать свой собственный служебный метод, который возвращает то, что вы хотите:

import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class MoreCollectors {

  public static <K, V> Collector<Entry<K, V>, ?, Map<K, V>> entriesToMap() {
    return Collectors.toMap(Entry::getKey, Entry::getValue);
  }
}
...