#java
#java
Вопрос:
У меня есть следующий интерфейс:
@FunctionalInterface
interface Mapper<I, O> {
Collection<O> map(I in);
}
И это планируется использовать следующим образом:
class Writer<E> {
private final Iterator<?> it;
private final Mapper<?, E> mapper;
private final Output<E> out;
public <T> Writer(Iterator<T> it, Mapper<T, E> mapper, Output<E> out) {
this.it = it;
this.mapper = mapper;
this.out = out;
}
void write() {
while (it.hasNext()) {
Collection<E> items = mapper.map(it.next());
for (E item : items) {
out.write(item);
}
}
}
}
Проблема в том, что пользователи класса Writer должны помещать каждое сопоставленное значение в коллекцию, даже если они хотят вернуть одно значение. Например:
List<String> strings = Arrays.asList("a", "b", "c");
Writer<String> writer = new Writer<>(
strings.iterator(),
str -> Collections.singletonList(str),
new FileOutput(...));
Пользователь должен написать str -> Collections.singletonList(str)
вместо Function.identity()
(или, например, ссылку на конструктор StringHolder::new
)
Есть ли какие-либо идеи о том, как упростить этот подход, или эта проблема просто надумана?
Спасибо!
Комментарии:
1. Предложите другой класс / конструктор для случаев, когда они хотят использовать отдельные значения, а не коллекции. Выясните, не упростят ли фабричные методы использование ваших материалов, чем указание пользователям напрямую вызывать конструкторы.
2. Кроме того, поскольку каждый экземпляр Writer, очевидно, предназначен только для одного использования, посмотрите, не можете ли вы заменить его просто статическим методом. Или несколько статических методов.
3. Ваш код подходит для общего случая, вам нужен удобный метод для случая отдельных значений. Либо добавьте конструктор, либо статический фабричный метод в
Writer
, который принимает одну строку и обрабатывает беспорядок, например, что-то вродеstatic void write(T value, Mapper<T, E> mapper, ...) { List<T> list = List.of(value); Writer w = new Writer(list.iterator(), str -> Collections.singletonList(str); ... }