流API按枚举分组

时间:2018-08-07 09:06:14

标签: java java-stream grouping

在使用Java Stream API时我需要一些帮助

我有一个对象列表,该对象具有ENUM字段{Song,Klip,Karaoke}

如何按Enum字段将列表分为三个单独的列表。我知道如何使用三个流(list.filter().collect三次)来做到这一点,但是我认为这不是最好的方法。

1 个答案:

答案 0 :(得分:1)

我建议使用Collectors.groupingBy,它返回一个Map。由于您未提供任何课程,因此我假设以下内容:

enum SomeEnum {
    SONG,
    KLIP,
    KARAOKE
}

static class SomeClass {

    SomeEnum someEnum;

    public SomeClass(SomeEnum someEnum) {
        this.someEnum = someEnum;
    }

    public SomeEnum getSomeEnum() {
        return someEnum;
    }
}

然后您可以简单地使用:

List<SomeClass> list = Stream.of(
            new SomeClass(SomeEnum.SONG),
            new SomeClass(SomeEnum.SONG),
            new SomeClass(SomeEnum.KLIP),
            new SomeClass(SomeEnum.KARAOKE),
            new SomeClass(SomeEnum.KARAOKE))
            .collect(Collectors.toList());

// this is what you are looking for
Map<SomeEnum, List<SomeClass>> map = list.stream()
        .collect(Collectors.groupingBy(SomeClass::getSomeEnum));

使用Map而不是三个不同的List对象是有意义的。