2015-10-22 2 views
-1

Я новичок в lambdas и фильтрую потоки и прочее в Java 8. Мне очень сложно с синтаксисом преобразования этого в стиль Java 8. Даже не убежден, что это возможно.Как написать это как Лямбда/Поток/Фильтр?

private List<RecordWrapperDto>filterRecordWrapperDtos(List<RecordWrapperDto> recordWrapperDtos){ 
    List<RecordWrapperDto> filteredRecordWrapperDtos = new ArrayList<>(); 
    Long recordId = null; 

    for(RecordWrapperDto rwDto : recordWrapperDtos) { 
     if(rwDto.getRecordWrapperId() != null && (recordId == null || recordId.equals(rwDto.getRecordId()))) { 
      filteredRecordWrapperDtos.add(rwDto); 
      recordId = rwDto.getRecordId(); 
     } 
    } 
    return filteredRecordWrapperDtos; 
} 

Вот одна из моих попыток (неправильно конечно):

if(CollectionUtils.isNotEmpty(recordWrapperDtos)) { 
     filteredRecordWrapperDtos = recordWrapperDtos.stream().filter(c -> { 
      return (c.getRecordWrapperId() != null && (recordId == null || recordId.equals(c.getRecordId()))); 
     }).collect(Collectors.toList()); 
    } 

Тхо меня кость? Одна из проблем заключается в том, что между каждым циклом сохраняется состояние. Возможно ли это сделать? Также в каждом примере я видел, если у вас было более одного параметра, например. (a,b) -> { stuff }, это был тот же тип, где «a» был одним элементом, а «b» был следующим элементом в коллекции ... что, если это не так? Могу ли я использовать это, чтобы что-то передать? Если это так, я не нахожу примеров.

+0

вы проверяете 'rwDto.getRecordWrapperId()! = Null', но вы никогда не используете его. не так ли? (потому что похоже, что вы берете первый идентификатор элемента, а затем берете все те, у которых один и тот же идентификатор записи) – njzk2

+0

Есть слишком много возможных ответов, или хорошие ответы будут слишком длинными для этого формата. Пожалуйста, добавьте детали, чтобы сузить набор ответов или изолировать проблему, на которую можно ответить в нескольких абзацах. –

+0

Вы правильно определили проблему: сохранение состояния во время обработки делает использование потоков трудными и непрактичными. Как я читаю ваш код, вы пытаетесь убедиться, что для каждого значения 'recordId' сохраняется только одна запись. Не могли бы вы просто перефразировать свое решение, чтобы построить карту? – biziclop

ответ

2

на основе кода, вы можете упростить вам алгоритм для этого:

  • взять первый элемент, который имеет getRecordWrapperId не нулевой
  • взять Индентификационный
  • фильтра поток в соответствии с этой записью ID

Как это:

Long recordId = recordWrapperDtos 
     .stream() 
     .filter(c -> c.getRecordWrapperId() != null) 
     .map(RecordWrapperDto::getRecordId) 
     .findFirst() 
     .orElse(null); 
return recordWrapperDtos 
     .stream() 
     .filter(c -> c.getRecordWrapperId() != null) 
     .filter(c -> recordId.equals(c.getRecordId())) 
     .collect(Collectors.toList()); 

Печальная часть состоит в том, чтобы передать два раза, чтобы сначала получить ненулевой recordWrapperId.

+0

@Tunaki, но обновление recordId полезно только в том случае, если оно «null», а это не так, поскольку оно установлено первым. – njzk2

+0

@Tunaki Правильно, но в исходном коде он устанавливается на каждом цикле. Вы устанавливаете его только один раз и вне цикла. – user447607

+0

Исправить. Он был предназначен для @ njzk2. – user447607