假设有一个简单的枚举类型叫做Type,定义如下:
我认为使用Stream API表达的功能等效于以下内容:
我们该如何更好、更简单地编写这段代码呢?这段代码感觉有些勉强,不太清晰。尤其是
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表达的功能等效于以下内容:
我认为使用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>
返回 T
的方法。
有更好的方式吗?
Stream
。你的for循环方法比任何使用Stream
的方法更清晰(也更快)。 - Paul BoddingtonfindFirst()
,但在IDEA中得到了一些奇怪的编译错误,因此我写了reduce()
变体。无论如何,我已经给你所有答案点赞了,但我觉得“first”比“any”更清晰,所以我选择了它。谢谢你的帮助! - quantum