Предположим, что существует простое перечисление с именем Type, определенное следующим образом:
enum Type{
X("S1"),
Y("S2");
private String s;
private Type(String s) {
this.s = s;
}
}
Поиск правильного перечисления для данного s
тривиально выполняется статическим методом с циклом for (предполагается, что метод определен внутри перечисления), например:
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>
.
Есть ли способ лучше?
Stream
для каждой отдельной проблемы. Ваш подход к циклу for понятнее (и быстрее), чем любой подход, использующийStream
s. - person Paul Boddington   schedule 07.01.2015StackOverflowException
... - person ajb   schedule 07.01.2015findFirst()
и получил несколько странных ошибок компиляции в IDEA, и написал вариантreduce()
. В любом случае, я проголосовал за все ваши ответы, но чувствовал, чтоfirst
понятнее, чемany
, поэтому я согласился. Спасибо за вашу помощь! - person quantum   schedule 07.01.2015