5

私は、EnumSetブール型プリミティブの配列との間で前後に変換したいと考えています。それがうまく機能する場合Listは、配列の代わりに、および/またはBooleanブールプリミティブではなくオブジェクトを使用できます。

enum MyEnum { DOG, CAT, BIRD; }
EnumSet enumSet = EnumSet.of( MyEnum.DOG, MyEnum.CAT ); 

反対側で取得したいのは、次のような配列です。

[TRUE, TRUE, FALSE]

ここでのこの質問は、 EnumSet を整数の配列に変換するに似ています。違い:

  • ブール値またはBoolean対整数 (明らかに)
  • 列挙型のすべてのメンバーを表し、TRUEfor each 列挙型要素が に含まれ、EnumSetfor FALSEeach 要素が から除外されますEnumSet。もう一方の質問の配列には、で見つかった項目のみが含まれますEnumSet。(さらに重要なことには)
4

3 に答える 3

4

今のところ、これ以上の解決策はありません。

Boolean[] b = Arrays.stream(MyEnum.values()).map(set::contains).toArray(Boolean[]::new);

を使用してプリミティブEnumSetの配列からを取得するにはbooleanzip

MyEnum[] enums = zip(Arrays.stream(MyEnum.values()), Arrays.stream(b),
    (e, b) -> b ? e : null).filter(Objects::nonNull).toArray(MyEnum[]::new);
于 2016-07-14T06:09:45.437 に答える
2

Java 8では、このようにすることができます

List<Boolean> present = Arrays.stream(MyEnum.values()).map(enumSet::contains).collect(Collectors.toList());

逆に行くには、このようなことができます

IntStream.range(0, present.size()).filter(present::get).mapToObj(i -> MyEnum.values()[i]).
    collect(Collectors.toCollection(() -> EnumSet.noneOf(MyEnum.class)));
于 2016-07-14T06:09:16.240 に答える