使用流API返回一定数量的枚举值

Mag*_*lex 1 java enums java-8 java-stream

使用Java 8中的流API,createObjects()下面将返回X单行中的对象列表.

public class StreamObjectCreator {

    public List<X> createObjects(Integer... s) {
        return Arrays.stream(s).map(X::new).collect(Collectors.toList());
    }

    private static class X {
        int s;
        public X(int s) {
            this.s = s;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,考虑以下枚举Y:

private static enum Y {

    VALUE_1(2), VALUE_2(1);

    private int i;

    private Y(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }

}
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情并返回以下列表:

[VALUE_1,VALUE_1,VALUE_2]

换句话说,i每个枚举值的出现.

使用"旧的"Java方式,它可以像这样实现.

List<Y> createEnumList() {
    List<Y> list = new ArrayList<Y>();
    for (Y y : Y.values()) {
        for (int i = 0; i < y.getI(); i++) {
            list.add(y);
        }
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)

可以使用流API或一些lambda表达式使用更少的样板代码来完成吗?我在流API上玩了一段时间没有成功,Google上发现的大多数信息都指向"更简单"的教程.

Hol*_*ger 7

我无法想象一个真实的用例但是

List<Y> createEnumList() {
    return EnumSet.allOf(Y.class).stream()
        .flatMap(y->Collections.nCopies(y.getI(), y).stream())
        .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

会做的.