使用Java 8将List <String>转换为Set

pab*_*blo 7 java java-8

是否有一个单行将String列表转换为一组枚举?例如,拥有:

public enum MyVal {
    ONE, TWO, THREE
}
Run Code Online (Sandbox Code Playgroud)

List<String> myValues = Arrays.asList("ONE", "TWO", "TWO");
Run Code Online (Sandbox Code Playgroud)

我想转换myValuesSet<MyVal>包含相同项目的项目:

EnumSet.of(MyVal.ONE, MyVal.TWO)
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 21

是的,你可以让Stream<String>你的元素,他们每个人映射到与映射器各自的枚举值MyVal::valueOf和收集到一个新的EnumSettoCollection被初始化noneOf:

public static void main(String[] args) {
    List<String> myValues = Arrays.asList("ONE", "TWO", "TWO");
    EnumSet<MyVal> set =
        myValues.stream()
                .map(MyVal::valueOf)
                .collect(Collectors.toCollection(() -> EnumSet.noneOf(MyVal.class)));
    System.out.println(set); // prints "[ONE, TWO]"
}
Run Code Online (Sandbox Code Playgroud)

如果您只是对Set结果感兴趣而不是a EnumSet,那么您可以简单地使用内置收集器Collectors.toSet().

  • 这些天算不算是单行:-)? (5认同)
  • @otonakav:你明确要求"EnumSet".如果任何`Set`就足够了,你可以使用`toSet()`,但是不要求`EnumSet` ...... (5认同)
  • @otonakav:也许只是我,但问题的标题读作"*将List <String>转换为带有Java 8*的EnumSet".显然"对一个**EnumSet**"相信我,Tunaki知道有'Collectors.toSet()`; 发布的解决方案`toCollection(() - > EnumSet.noneOf(MyVal.class))`仅适用于您的具体问题. (4认同)
  • 我建议修改标题并扩展答案,因为`toSet()`当`Set`的类型无关紧要时,显然更容易使用. (3认同)
  • @Holger实际上,我将标题改为了,因为最初它是"转换为一组枚举",并且由于OP说"包含与EnumSet相同的项目",我"澄清"标题"转换为EnumSet"......看起来不是真的. (2认同)