Ошибка компилятора при использовании Java Optional.map в строку из логического значения - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы переписать этот код, используя Optional -подобный код:

private Order buildOrder(String field) {
    if (field.startsWith("-")) {
        return Order.desc(field.substring(1));
    }
    else {
        return Order.asc(field);
    }
}

До сих пор я мог кодировать это:

private Order buildOrder(String field) {
    return Optional.of(field.startsWith("-"))
      .filter(Boolean::booleanValue)
      .map(() -> field.substring(1))  <<<<1>>>>
      .orElse(field)
      .map(Order.desc(field.substring(1)))
      .orElse(Order.asc(field));
}

Но я получаю эту ошибку компиляции на <<<<1>>>>:

Подпись лямбда-выражения не соответствует сигнатуре метода функционального интерфейса apply(? super Boolean) Несоответствие типов: невозможно преобразовать из String в? extends U

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Ваша цепочка методов не будет работать, потому что вы создаете Optional<Boolean>, и это не может быть сопоставлено с String, полученным из field.Вам нужно иметь Optional<String>.
Это то, что я пришел с

private Order buildOrder(String field) {
    return Optional.of(field)
                .filter(f -> field.startsWith("-"))
                .map(f -> Order.desc(field.substring(1))
                .orElse(Order.asc(field));
}
0 голосов
/ 18 февраля 2019

Вы также можете избежать необязательного логического значения, что упростит метод:

return Optional.of(field)
        .filter(f -> f.startsWith("-"))
        .map(s -> s.substring(1))
        .map(Order::desc)
        .orElseGet(() -> Order.asc(field));
...