首页 > 解决方案 > 从枚举类型中获取所有数据

问题描述

我有一个enumnamed Product,每个项目都覆盖它的抽象方法,它返回一个Manufacture实例:

public enum Product {
     FOO {
       @Override
       Manufacture getManufacture(){
            return // a instance of Manufacture
       }
     }

     BAR {
       @Override
       Manufacture getManufacture(){
            return // another instance of Manufacture
       }
     }

    abstract Manufacture getManufacture();
}

Manufacture是我创建的另一个类,但查看这个问题的详细信息并不重要)

问题 1:在另一个类中,我想Set<Manufactore>Product枚举中获取一组制造 ()。Java 8 中最简单的方法是什么?

问题 2:aList<Manufacture>呢?

问题3:如果可能的话,如何在枚举类中对问题1和2做同样的事情?

标签: javajava-8

解决方案


Stream.of(Product.values()).map(Product::getManufacture)返回Stream<Manufacture>。现在你可以调用它了

  1. .collect(Collectors.toSet())要得到Set<Manufacture>
  2. .collect(Collectors.toList())得到List<Manufacture>

编辑:第三点

如果您想从枚举内部访问这些集合,您可以将它们存储在一些私有静态字段中并使用获取器。为了避免让客户修改这些集合,您可以每次在 getter 中返回它们的副本,例如通过,return new ArrayList(manufactureSet);或者您可以使该集合不可变,然后像这样返回它

private static Set<Manufacture> manufacturers = Collections.unmodifiableSet(
        Stream.of(values()).map(MyEnum::getManufacture).collect(Collectors.toSet())
);

public static Set<String> getManufacturers() {
    return manufacturers;
}

推荐阅读