使用Java 8 Stream API查找枚举值
使用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