加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

我应该将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中是正确的.这与函数式编程无关.

如你所说:

every time I add a new type I have to update all my switch statements

你的“工厂lambda”打破了Open/closed principle:

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<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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读