使用Java 8流将枚举转换为set

时间:2018-03-13 03:07:09

标签: java-8 stream

我有一个枚举看起来像:

public enum Movies {
SCIFI_MOVIE("SCIFI_MOVIE", 1, "Scifi movie type"),
COMEDY_MOVIE("COMEDY_MOVIE", 2, "Comedy movie type");

private String type;
private int id;
private String name;

Movies(String type, int id, String name) {
    this.type = type;
    this.id = id;
    this.name = name;
}

public int getId() {
    return id;
}

}

我知道我可以使用信息流创建一组电影enum,其中包含:

Set<Movie> Movie_SET = Arrays.stream(Movie.values()).collect(Collectors.toSet());

如果我想创建一组枚举电影ID,该怎么办?有没有办法用流来做到这一点?

3 个答案:

答案 0 :(得分:3)

是的,假设你的id有一个吸气剂,你的电影枚举可能如下所示:

public enum Movies {
    SCIFI_MOVIE("SCIFI_MOVIE", 1, "Scifi movie type"),
    COMEDY_MOVIE("COMEDY_MOVIE", 2, "Comedy movie type");

    private String type;
    private int id;
    private String name;

    Movies(String type, int id, String name) {
        this.type = type;
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }
}

然后,您可以使用Stream.map()

获取一组ID
Set<Integer> movieIds = Arrays.stream(Movies.values()).map(Movies::getId)
    .collect(Collectors.toSet()); 
BTW,创建所有电影集的另一种方法是使用EnumSet.allOf()

Set<Integer> movieIds = EnumSet.allOf(Movies.class).stream().map(Movies::getId)
    .collect(Collectors.toSet());

答案 1 :(得分:2)

您可以为此目的使用EnumSet实现,例如

获取电影集:

Set<Movies> movies = EnumSet.allOf(Movies.class);

仅获取电影ID:

Set<Integer> moviesIds = movies.stream().map(Movies::getId).collect(Collectors.toSet());

答案 2 :(得分:1)

如果您能够获得Enum值的流,那么很容易实现休息。

您可以使用custom Collector impl(我最喜欢的),请参阅下面的自定义收藏家示例: -

 Set<Integer> movieIds = Arrays
                .stream(Movies.values())
                .collect(
                         HashSet::new,
                         (set, e) -> set.add(e.getId()),
                         HashSet::addAll
                );

或者您可以使用map仅提取ID,collect可以像往常一样将这些ID收集到Set中。

Set<Integer> movieIds = Arrays
                        .stream(Movies.values())
                        .map(Movies::getId)
                        .collect(Collectors.toSet());