2017-01-23 1 views
0

Ниже приведен цикл for, используемый для итерации запросов и, тем самым, выполнения некоторой логики (получение/установка и выполнение нулевых проверок)Я пытаюсь использовать потоки в Java8.Trying для преобразования цикла for для итерации списка (существующий код для потока

for (Request request : requests) { 


     if (request != null && request.getProfileId() != null && 0 < request.getProfileId().longValue()) { 


       Detail profileInfo=profileServiceHelper.retreieveProfile(request.getProfileId()); 

       if (profileInfo != null) { 
        Info info=requestMapper.mapLiloProfileDetail(profileInfo, request); 

        if (info!= null) { 
         profiles.add(info); 
        } 
       } 
      } 
     } 

Я пытаюсь преобразовать выше цикл для потока:. до сих пор, что я сделал это (создал поток, используемый фильтром и карта)

requests.stream() 
    .filter(request->request != null && request.getProfileId() != null && 0 < request.getProfileId().longValue()) 
    .map(request -> profileServiceHelper.retreieveProfile(request.getProfileId())); 
     //.map((profileDetail,request)->(profileDetail!=null)?requestMapper.mapLiloProfileDetail(profileDetail, request):""); 

мне нужно передать функцию с двумя параметрами в методе отображения потока.

Пожалуйста помочь

+0

Пожалуйста, начните с редактирования вашего вопроса во что-то более читаемое. – Eran

+0

отредактировал мой код! – Hali

+5

Пожалуйста, не отрицайте ваши сообщения. – Adriaan

ответ

-1

Попробуйте это:

Predicate<Request> filter = req -> req != null && req.getProfileId() != null && 0 < req.getProfileId().longValue() && profileServiceHelper.retreieveProfile(req.getProfileId()) != null && requestMapper.mapLiloProfileDetail(profileInfo, req) != null; 
    requests.stream().filter(filter).forEach(req -> profiles.add(requestMapper.mapLiloProfileDetail(profileServiceHelper.retreieveProfile(req.getProfileId()), req))); 
+0

Я получил это ... выше код работал файл ... но я хочу, чтобы реальные способы использования лямбда в повседневном коде или, скорее, преломление существующего кода для java8. У меня есть такие методы, как mapOneObjectToAnother, который берет один и преобразуется в другой. – Hali

+0

revClassTO = new com.wdw.folio.service.transferobject.RevenueClassificationTO(); revClassTO.setName (классификацияVO.getName()); revClassTO.setRevenueClassificationID (Long.valueOf (классификацияVO.getId())); – Hali

+0

Я хочу знать, в каких сценариях лямбды полезны, кроме потоков. – Hali

0

Возвращаясь к предыдущему значению осуществляется в потоке всегда является проблемой. Вот обходной путь, который работает, устраняя необходимость вызова Stream#filter для проверки нулей.

Альтернативный вариант проверки подлинности в стиле выражения заключается в использовании статических методов Java 8 Optional#ofNullable и Optional#map. Это даже позволяет вставлять всю нулевую проверку и отображение в forEach, что означает, что мы можем вернуться к оригиналу request!

requests.forEach(r -> Optional.ofNullable(r) 
     .map(Request::getProfileId).map(id -> profileServiceHelper::retrieveProfile) 
     .map(d -> requestMapper.mapLiloProfileDetail(d, r)).ifPresent(profiles::add)); 

Еще одно изменение, которое я сделал в последовательности вещей является то, что это последнее утверждение расщепляется getProfileId и profileServiceHelper.retrieveProfile на два отдельных этапа. Это делает его более читаемым и позволяет ссылаться на метод.

0

К сожалению, объекты Stream не позволяют получить доступ к значениям предыдущего шага на любом из последующих шагов - каждый шаг в обработке потока подразумевается как «его собственная вещь», и в идеале он должен также зависеть только от шага входы.

Но возвращаясь к вопросу под рукой, вот как это можно решить:

requests.stream() 
    .filter(Objects::nonNull) // you might actually want to review if there can be a null there, looks very awkward if they can 
    .filter(request -> request.getProfileId() != null && 0 < request.getProfileId()) 
    .flatMap(request -> { 
    Detail profileInfo = profileServiceHelper.retrieveProfileInfo(request.getProfileId()); 
    if (profileInfo != null) { 
     return Stream.of(requestMapper.mapLiloProfileDetail(profileInfo, request)); 
    } 
    else return Stream.empty(); 
    }) 
    .filter(Objects::nonNull) 
    .forEach(profiles::add); 

ли к сведению, однако, что лямбды Java8 в и ссылки метод не быть-все в конце концов, и там, как правило, очень мало нужно для преобразования кода, который отлично работает в потоках и лямбдах.

Смежные вопросы