Как задать условие в Enum'e в Java 8?

Имеется enum:

public enum CommandType {
    LOGIN(new SignInCommand()),
    LOGOUT(new LogoutCommand());

    private Command command;

    CommandType(Command command) {
        this.command = command;
    }

    public Command getCommand() {
        return this.command;
    }
}

И я хочу с помощью стрима проверить, имеется ли данный enum и вернуть Optional.empty() в случае его отсутствия. Делаю это так:

return Arrays.stream(CommandType.values())
                .filter(type -> type.name().equalsIgnoreCase(requestCommand))
                .findFirst()
                .map(CommandType::getCommand);

Вопрос: как в данном способе вернуть Optional.empty, если будет передано значение в переменную requestCommand, отсутствующее в enum'e?

Насколько мне известно, findFirst() возвращает первый элемент из стрима (возвращает Optional). Пробовал так, но это не верно:

return Arrays.stream(CommandType.values())
                .filter(type -> type.name().equalsIgnoreCase(requestCommand))
                .findFirst()
                .map(CommandType::getCommand)
                .orElse(Optional.empty());

Ответы (1 шт):

Автор решения: Roman Konoval

findFirst превращает stream в Optional. Так что либо делайте сначала map, а уже потом findFirst:

return Arrays.stream(CommandType.values())
                .filter(type -> type.name().equalsIgnoreCase(requestCommand))
                .map(CommandType::getCommand)
                .findFirst()
;

Либо используйте Optional.flatMap, чтоб преобразовать значение, если оно есть:

return Arrays.stream(CommandType.values())
                .filter(type -> type.name().equalsIgnoreCase(requestCommand))
                .findFirst()
                .flatMap(CommandType::getCommand);
→ Ссылка