我应该将java Stream.map函数与switch语句一起使用吗?
发布时间:2020-12-15 04:43:56 所属栏目:Java 来源:网络整理
导读:我想根据类型将对象流传输到不同的对象. 例如 : StreamAnimal 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
我想根据类型将对象流传输到不同的对象.
例如 : 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); } } 这是一个功能性编程“反模式”吗? 我可以通过函数式编程实现上述不同吗? (备注:我也不喜欢每次添加新类型时我都需要更新所有的switch语句) 解决方法
@TimB在其
answer中是正确的.这与函数式编程无关.
如你所说:
你的“工厂lambda”打破了Open/closed principle:
您可以创建遵循此原则的动物工厂: 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,Object>>(); 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); } } 你可以在taking advantage of java 8 feature之前轻松使用它: 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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |