jac*_*ack 3 java lambda functional-programming java-8
我想根据类型将对象流传输到不同的对象.例如 :
Stream<Animal> animals = Arrays.stream(Arrays.asList(new Animal("A"),new Animal("B")));
Stream result = animals.map(animal) ->{
switch (animal.getType()) {
case "A" : return new Bird(animal);
case "B" : return new LION(animal);
case "C" : return new Tiger(animal);
case "D" : return new FISH(animal);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个功能性编程"反模式"吗?
我可以通过函数式编程实现上述不同吗?
(备注:我也不喜欢每次添加新类型时我都需要更新所有的switch语句)
@TimB的答案是正确的.这与函数式编程无关.
如你所说:
每次添加新类型时,我都要更新所有的switch语句
你的"工厂lambda"打破了开放/封闭的原则:
软件实体(类,模块,函数等)应该是可以扩展的,但是关闭以进行修改
您可以创建遵循此原则的动物工厂:
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<String, Function<Animal, Object>> delegateFactories
= new HashMap<String, Function<Animal,Object>>();
public AnimalFactory withFactory(String type, Function<Animal, Object> factory) {
delegateFactories.put(type, factory);
return this;
}
public Object createAnimal(Animal animal) {
return delegateFactories.get(animal.getType()).apply(animal);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以利用java 8功能轻松使用它:
public static void main(String[] args) {
Stream<Animal> 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3710 次 |
| 最近记录: |