带有EnumSet Stream的java.util.stream.Collectors

Som*_*kar 28 java enumset java-8 java-stream

我试图用代替位掩码来代码

public static Set<Amenities> fromBitFlags(int bitFlag) {
    return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0).collect(Collectors.toSet());
}
Run Code Online (Sandbox Code Playgroud)

我想返回EnumSet而不是简单的集合(不要因为转换而放弃EnumSet的实用性).

需要一些有关如何创建自定义收集器以收集EnumSet的说明.

Tag*_*eev 59

你可以使用toCollection(Supplier):

return ALL_OPTS.stream().filter(a -> (a.ameityId & bitFlag) > 0)
               .collect(Collectors.toCollection(() -> EnumSet.noneOf(Amenities.class)));
Run Code Online (Sandbox Code Playgroud)

toCollection方法接收一个lambda,它应该创建一个空集合来存储结果.这里我们EnumSet使用EnumSet.noneOfcall 创建空.请注意,EnumSet您必须始终指定(隐式或显式)此枚举的枚举.

  • 注意'EnumSet <Amenities> s = EnumSet.copyOf(ALL_OPTS)的替代方案; s.removeIf(a - >(a.ameityId&bitFlag)<= 0);`... (5认同)
  • @qutax 命名风格表明“ALL_OPTS”是一个包含所有选项的常量,具有可预测的非空内容。OP 对失去 EnumSet 有用性的担忧也表明“ALL_OPTS”首先是一个“EnumSet”。当然,如果不是这种情况,修复起来也很容易。 (2认同)
  • @qutax 如果 `ALL_OPTS` 是一个 `EnumSet`,它是否为空并不重要,因为 `EnumSet.copyOf(ALL_OPTS)` 将始终有效。事实上,我认为“ALL_OPTS”为空的情况值得产生异常,而不是继续处理空结果集。 (2认同)