Неверный тип возвращаемого значения в справочнике по методу: невозможно преобразовать сотрудника в необязательный‹U›

Я пытаюсь написать лямбда-функцию, которая получает предпочтение местоположения сотрудника и имеет пример кода ниже.

Но для моей лямбда-функции я получаю ошибку компиляции в flatMap(this::buildEmployeeGeolocation), говоря Bad return type in method reference: cannot convert com.abc.EmployeeGeolocation to java.util.Optional<U>.

Что мне здесь не хватает?

public Optional<EmployeeGeolocation> getEmployee(final SessionId sessionId) {
    return Optional.ofNullable(employeePreferencesStore.getEmployeeAccountPreferences(sessionId))
            .map(preferences -> preferences.getPreference(PreferenceKey.Location))
            .filter(StringUtils::isNotBlank)
            .map(this::readEmployeelocation)
            .flatMap(this::buildEmployeeGeolocation);
}

private Optional<EncryptedGeolocation> readEmployeeLocation(@NonNull final String encryptedGeolocation) {
    try {
        return Optional.ofNullable(objectMapper.readValue(encryptedGeolocation, EmployeeGeolocation.class));
    } catch (final IOException e) {
        log.error("Error while reading the encrypted geolocation");
        throw new RuntimeException(e);
    }
}

private EmployeeGeolocation buildEmployeeGeolocation(@NonNull final EncryptedGeolocation unditheredEncryptedGeolocation) {
    return EmployeeGeolocation.builder()
            .latitude(10.0)
            .longitude(10.0)
            .accuracy(1.0)
            .locationType(ADDRESS)
            .build();
}

person koustubhC    schedule 23.10.2019    source источник


Ответы (1)


Похоже, вам действительно нужно поменять местами map и flatMap. Изменить код

.map(this::readEmployeeLocation) 
.flatMap(this::buildEmployeeGeolocation);

to

.flatMap(this::readEmployeeLocation) // since you already have an Optional<String>
.map(this::buildEmployeeGeolocation); // above results in Optional<EncryptedGeolocation>

Важно. Судя по коду Optional.ofNullable(...).map(...).filter(StringUtils::isNotBlank), до этой операции это приведет к Optional<String>.

person Naman    schedule 23.10.2019