Поток в orElse опционально - PullRequest
       22

Поток в orElse опционально

0 голосов
/ 21 ноября 2018

Я пытаюсь использовать Stream в orElse и испытываю трудности в понимании ошибки.

collectorConfiguration = Optional.ofNullable(recapPlacement.getAttId())
    .map(attId -> Optional.ofNullable(processorEngine.buildFrimFromAttId(attId))
         .orElseThrow( () -> new OmegaException("UnableToFirmByAttId", recapPlacement.getAttId())))
    .orElse( () -> Optional.ofNullable(collectorConfigurations.stream() //getting error here
        .filter(cc -> recapPlacement.getPnetCode().equals(cc.getPnetCode()))
        .filter(Objects::nonNull)
        .findFirst())
        .orElseThrow( () -> new OmegaException("CollectorCouldNotMapForPnetCode", recapPlacement.getPnetCode()))
    );

В целом в приведенном выше коде я пытаюсь

  1. получить collectorConfig, если attId не равно нулю

  2. , если attId не равно нулю и collectorConfig не найдено для этого attId, тогда я выдаю исключение

  3. , если attId равно нулю, тогда я использую pnet код для получения collectConfig при потоковой передаче collectConfigurations список

  4. , еслиcollectConfig не найдено для pnetCode, тогда я выдаю исключение

В блоке orElse выдается ошибка компиляции 'Target type of a lambda expression must be an interface'.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Возможно, вы захотите заменить

.orElse( () -> Optional.ofNullable(collectorConfigurations.stream() //getting error here

на Optional.orElseGet, что предполагает Supplier как:

.orElseGet( () -> Optional.ofNullable(collectorConfigurations.stream() ...

В дополнение квыше, вам не нужно Optional.ofNullable у поставщика

.orElseGet( () -> collectorConfigurations.stream()
    .filter(cc -> recapPlacement.getPnetCode().equals(cc.getPnetCode()))
    .filter(Objects::nonNull) //non-null filtered
    .findFirst()) // optional
    .orElseThrow( () -> new OmegaException("CollectorCouldNotMapForPnet...
0 голосов
/ 21 ноября 2018

orElse принимает обычное значение, а не все, что может быть представлено лямбда-выражением.Простое удаление () -> должно помочь.В качестве альтернативы вы могли бы позвонить orElseGet

...