如何将 EnumSet<A> 转换为 Set<B>

How to convert EnumSet<A> to Set<B>

我有一个枚举 class 是这样的:

enum class SomeType(val id: String) {
    TYPE1("A"),
    TYPE2("B"),
    TYPE3("C"),
    TYPE4("D")
}

现在,我需要筛选 Something 的列表,其中包含一个在 SomeType 枚举中声明的字符串。所以基本上我有这样的东西:

class Something(val id: String)
// where the value of id is one of the value of the SomeType's id

我有一个这样的列表:

val somethingList = arrayListOf<Something>(
    Something("A"),
    Something("B"),
    Something("A"),
    Something("C"),
    Something("D"),
    Something("A"),
    Something("D")
)

现在我需要根据给定的 EnumSet<SomeType> 过滤 somethingList

所以如果我有一个:

val someTypeSet = EnumSet.of(SomeType.Type3, SomeType.Type2)

结果过滤列表应该是,

val filteredList = arrayListOf<Something>(
    Something("B"),
    Something("C")
)

我的想法是将 someTypeSet 转换为 Set<String> 并执行如下操作:

Set<String> setOfSomeTypeIds = convertToSet(someTypeSet)
val filteredList = somethingList.filter { something ->
    setOfSomeTypeIds.contains(something.id)
}

有人可以指导我如何将其值的 EnumSet 转换为 Set 吗?

我也解释了整个过程,以防万一上面的问题有更好的解决方案。

不胜感激。

提前致谢。

筛选相关类型后即可使用map功能

val filteredSomethings:List<Something> = someTypeSet.filter { something ->
            setOfSomeTypeIds.contains(something.id) }.map { Something(it.id) }

它会 return 一个包含 Something 和相关 ID 的列表。

您可以使用map on any collection to transform it to a new collection with the desired values... i.e. someTypeSet.map { it.id } will already return you a list of string. If you really want to have a Set you can also use something like mapTo. Regarding the filter that might also be simplifiable using the in-关键字,例如:somethingList.filter { it.id in setOfSomeTypeIds }.

如此总结:

val setOfSomeTypeIds = someTypeSet.map { it.id }

val filteredList = somethingList.filter { it.id in setOfSomeTypeIds }