【问题标题】:java.util.stream.Collectors with EnumSet Streamjava.util.stream.Collectors 与 EnumSet 流
【发布时间】:2016-05-12 17:21:47
【问题描述】:

我正在尝试使用下面的位掩码代替代码

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

我想返回 EnumSet 而不是一个普通的集合(不想因为强制转换而放弃 EnumSet 的用处)。

需要一些关于如何创建自定义收集器来收集 EnumSet 的说明。

【问题讨论】:

    标签: java java-8 java-stream enumset


    【解决方案1】:

    你可以使用toCollection(Supplier):

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

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

    【讨论】:

    • 非常感谢,如果你能简要解释一下这个 lambda () -&gt; EnumSet.noneOf(Amenities.class) 会非常有帮助,这将如何创建一个可以自动调用 EnumSet.add() 的供应商
    • @SomasundaramSekar,添加了一些解释。希望这会有所帮助。
    • 注意EnumSet&lt;Amenities&gt; s=EnumSet.copyOf(ALL_OPTS); s.removeIf(a -&gt; (a.ameityId &amp; bitFlag) &lt;= 0);的替代品...
    • @qutax 的命名风格表明ALL_OPTS 是一个包含所有选项的常量,具有可预测的非空内容。 OP 对失去 EnumSet 有用性的担忧也表明 ALL_OPTS 首先是 EnumSet。当然,如果不是这种情况,也很容易解决。
    • 如果 ALL_OPTS 是 EnumSet,那么它实际上不是常量的可能性很高,因为 JumboEnumSetRegularEnumSet 都是可变的,我不认为 OP 实现了不可修改的实现的EnumSet。是的,对于这种特殊情况,很可能 ALL_OPTS 不为空(尽管根据实际情况 ALL_OPTS 可能根本没有选择,我猜)。但是由于人们经常复制和粘贴在 SO 上找到的代码,即使它与他们的情况 100% 不匹配,我觉得有必要指出在使用您的(我认为不好的)替代方案时产生异常的机会。
    猜你喜欢
    • 2021-09-09
    • 2016-02-22
    • 2016-03-22
    • 2013-03-23
    • 1970-01-01
    • 2011-01-25
    • 2020-10-26
    • 2016-03-30
    • 2011-05-24
    相关资源
    最近更新 更多