Ваш подход мне кажется верным, но я стараюсь избегать прямой реализации Function
в максимально возможной степени. Основная причина: наименование .
Я могу понять, что если у класса есть значимое имя (например, InOutMapFunction
), вам может не потребоваться, чтобы у метода также было значимое имя. Тем не менее, я предпочитаю имена, такие как InOutMapper.mapInToOut
для InOutMapFunction.apply
.
Кроме того, если вы можете придумать более одного InOutMapper
, сделайте его интерфейсом и дайте компоненту реализовать его.
Некоторые могут полагать, что не стоит создавать свои собственные функциональные интерфейсы, если они «соответствуют» существующим, но я вряд ли когда-либо об этом сожалею, особенно в том, что в реальных случаях это сильно влияет на читабельность, например, Для сравнения:
SomeParticularTypeContextFinder
и
Function<SomeParticularType, SomeParticularTypeContext>
.
Вот как я могу реализовать ваш пример:
@Component
public class PlainInOutMapper implements InOutMapper {
@Override
public Out mapInToOut(In in) { .... }
}
@FunctionalInterface
interface InOutMapper {
Out mapInToOut(In in);
}
// example usage
@RestController
public class MyApi {
private List<In> someList;
private InOutMapper mapper;
public void foo() {
someList.stream()
.map(mapper::mapInToOut)
. // whatever
}
}