使用Java 8 Stream API查找枚举值

14 浏览
0 Comments

使用Java 8 Stream API查找枚举值

假设有一个简单的枚举类型Type,定义如下:

enum Type{
    X("S1"),
    Y("S2");
    private String s;
    private Type(String s) {
        this.s = s;
    }
}

使用静态方法和for循环(假设该方法在枚举内部定义)可以轻松找到给定s的正确枚举,例如:

private static Type find(String val) {
        for (Type e : Type.values()) {
            if (e.s.equals(val))
                return e;
        }
        throw new IllegalStateException(String.format("Unsupported type %s.", val));
}

我认为使用Stream API表达的函数等效于以下代码:

private static Type find(String val) {
     return Arrays.stream(Type.values())
            .filter(e -> e.s.equals(val))
            .reduce((t1, t2) -> t1)
            .orElseThrow(() -> {throw new IllegalStateException(String.format("Unsupported type %s.", val));});
}

我们如何更好、更简单地编写这段代码?这段代码感觉不够自然,也不够清晰。特别是reduce()方法似乎很笨拙,被滥用了,因为它没有累积任何内容,也不执行任何计算,而只是简单地返回t1(假设过滤器返回一个值 - 如果没有返回一个值,那显然是个灾难),更不用说t2是多余且令人困惑的了。然而,我在Stream API中找不到任何可以直接从Stream中返回一个T的方法。是否有更好的方式?

0