Уменьшите сопоставления извлечения, чтобы извлечь только поля соответствующего типа, и объявите их как BiConsumer
:
public class EntityExtraction {
private static final BiConsumer<JsonNode, Animal> extractAnimal = (node, animal) -> {
animal.setName(node.get("name").asText());
animal.setAge(node.get("age").asText());
};
private static final BiConsumer<JsonNode, Dog> extractDog = (node, dog) -> {
dog.setColor(node.get("color").asText());
};
}
Каждый BiCosnumer
получает JsonNode
, из которого он извлекает значения дляопределенный Animal
тип.
Теперь мы расширяем EntityExtraction
заводским методом, который будет возвращать извлеченный Dog
:
public static Dog extractDog(JsonNode node) {
Dog dog = new Dog();
BiConsumer<JsonNode, Dog> extraction = extractDog.andThen(extractAnimal);
extraction.accept(node, dog);
return dog;
}
. В качестве входных данных используется только JsonNode
.Поскольку предполагается извлечь Dog
, он создает экземпляр и применяет к нему все необходимые сопоставления извлечения.
Чтобы отобразить JsonNode
, мы используем фабричный метод.
Dog dog = EntityExtraction.extractDog(node);
Более сложные сопоставления извлечения могут быть построены путем создания цепочки извлечения.