我有两个类,一个是Animal(动物),另一个是Dog(狗)。
public class Animal {
private String name,age;
//public getters and setters
}
public class Dog extends Animal {
private String color;
//public getters and setters
}
我正在使用Java 8函数式编程从JSON节点中提取字段,即
public class EntityExtraction {
private Function<JsonNode, Animal> extractAnimal = node -> {
Animal animal = new Animal();
animal.setName(node.get("name").asText()));
animal.setAge(node.get("age").asText()));
return animal;
};
private Function<JsonNode, Dog> extractDog = node -> {
Dog dog = new Dog();
dog.setName(node.get("name").asText()));
dog.setAge(node.get("age").asText()));
dog.setColor(node.get("color").asText()));
return dog;
};
}
问题在于它不是面向对象的。如果Animal类中有一个新字段,则必须在两个函数方法(即extractDog和extractAnimal)中显式地添加它。
是否有一种方法可以在不通过构造函数的情况下,使用extractDog方法在Dog类中设置超类字段,例如:
private Function<JsonNode, Dog> extractDog = node -> {
Dog dog = new Dog();
//extract superclass fields
//dog.animal = extractAnimal.apply(node);
dog.setColor(node.get("color").asText()));
return dog;
};
Function
?使用类似于Dog extractDog(JsonNode node)
的签名不就足够了吗?在流中,你仍然可以非常方便地调用它。例如,map(extractDog())
将变成:map(this::extractDog)
(如果该方法在同一类中)。如果你需要从其他地方调用它,你不需要调用apply
,只需像调用任何常规函数一样调用它,例如Dog dog = extractDog(json)
。 - RolanddogAge
JSON字段与Dog
中的age
字段匹配。 - Andrew Tobilko