Невозможно написать сумматор с предоставленным вами интерфейсом.Проблема в том, что объединителю нужен способ объединения двух Options
, но этого не существует.Единственное, что можно сделать с экземпляром Options
, это добавить к нему одну пару.Я не могу получить какую-либо информацию из этого.Предположительно, он не может сделать что-то очень полезное.
Возможно, эта проблема связана с тем, что у Java нет признаков, и интерфейсы Java не являются подходящей заменой признаков.
Идиоматический способ Javaчтобы написать это просто стандартный болван для цикла:
Options<String, String> options = /*whatever*/;
List<Pair<String, String>> elems = /*whatever*/;
for (Pair<String, String> pair : elems)
{
options = options.add(pair.getKey(), pair.getValue());
}
Если вы можете справиться с тем фактом, что вам никогда не удавалось использовать параллельный поток, вы можете воспользоваться тем, чтопоследовательный поток никогда не будет использовать объединитель.Таким образом, вы можете написать Collector
, который определяет комбинатор, который просто сгенерирует исключение.
Options<String, String> foo = elems.stream()
.collect(
() -> options,
(opt, pair) -> opt.add(pair.getKey(), pair.getValue()),
(a, b) -> { throw new UnsupportedOperationException(); }
);
Если вы действительно хотите использовать reduce
, вам нужно изменить свой интерфейс либораскрыть некоторую информацию о парах ключ-значение, которые он содержит, или предоставить средство для добавления более чем одной пары ключ-значение одновременно.Например:
interface Options<K, V>
{
Options<K, V> add(K key, V value);
Options<K, V> add(Options<K, V> otherOptions);
}
Options<String, String> options = /*whatever*/;
List<Pair<String, String>> elems = /*whatever*/;
Options<String, String> foo = elems.stream()
.reduce(
options,
(opt, pair) -> opt.add(pair.getKey(), pair.getValue()),
Options::add
);
Я сомневаюсь, что это то, что вы хотели услышать, но Scala и Java - это разные языки.Вы не должны ожидать, что все будет иметь точную параллель.Если бы это было так, то не было бы оснований для существования обоих языков.