Я создаю своего рода фреймворк, чтобы избежать повторения кода, и в определенный момент мне нужно преобразовать список объектов Foo в список объектов Bar.Java generics and streams
У меня есть объекты базы данных, которые расширяют
public class BaseEntity {...}
и объекты презентации, которые расширяют
public class BaseDTO<T extends BaseEntity> {...}
так
public class Foo extends BaseEntity {...}
и
public class Bar extends BaseDTO<A extends BaseEntity> {
public Bar(Foo entity, Locale l) {
...
}
}
Теперь, чтобы преобразовать список адвокатов в список Foo легко используя потоки
public abstract ClassThatUsesFooAndBar() {
public List<Bar> convertFooToBar(List<Foo> list) {
return list.stream().map(f -> new Bar(f, locale)).collect(...);
}
}
Но и здесь есть вопрос, эти Foo и Bar фактически непатентованные (А и В), поэтому класс который использует Foo и Bar, фактически равен ClassThatUsesAandB<A extends BaseEntity, B extends BaseDTO>
, так что функция должна быть абстрактной и реализована как шаблонный код с правильными реализациями A и B, потому что, очевидно, вы не можете создавать типичные типы.
Есть ли способ использовать generics/streams/lambdas для создания функции, которая может быть записана один раз, чтобы классы реализации не нуждались в повторной реализации? Функция подписи будет
public List<B> convertAToB(List<A> list);
Я надеюсь, что я был достаточно ясно, что мне нужно, если вам нужны дополнительные пояснения, пожалуйста, спросите
Спасибо!
Пожалуйста, не используйте имена классов с одной буквой, так как их очень сложно отличить от параметров типа. Если вы застряли в случайных именах, вы можете использовать 'Foo',' Bar' или 'Baz'. – biziclop
На самом деле я использовал A и B, потому что в конце обсуждения они фактически являются параметрами типа. Я попытаюсь перефразировать ... – Luca
Можете ли вы уточнить использование дженериков? вы пишете A/B extends AnObject, но в вашем примере A/B не расширяет ничего – AdamSkywalker