Предположим, что существует простое перечисление, называемое Type, определенное следующим образом:
enum Type{
X("S1"),
Y("S2");
private String s;
private Type(String s) {
this.s = s;
}
}
Поиск правильного перечисления для данного s
выполняется тривиально со статическим методом с помощью for-loop (предположим, что метод определен внутри enum), например:
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, который просто как-то возвращает непосредственно T
из Stream<T>
.
Есть ли лучший способ?