@TimB在其
answer中是正确的.这与函数式编程无关.
如你所说:
every time I add a new type I have to update all my switch statements
software entities (classes,modules,functions,etc.) should be open for extension,but closed for modification
您可以创建遵循此原则的动物工厂:
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream;
public class AnimalFactory {
private final Map> delegateFactories
= new HashMap>();
public AnimalFactory withFactory(String type,Object> factory) {
delegateFactories.put(type,factory);
return this;
}
public Object createAnimal(Animal animal) {
return delegateFactories.get(animal.getType()).apply(animal);
}
}
public static void main(String[] args) {
Stream animals = Arrays.asList(new Animal("A"),new Animal("B")).stream();
AnimalFactory animalFactory = new AnimalFactory();
animalFactory.withFactory("A",Bird::new);
animalFactory.withFactory("B",Lion::new);
animalFactory.withFactory("C",Tiger::new);
animalFactory.withFactory("D",Fish::new);
Stream result = animals.map(animalFactory::createAnimal);
}