Поток Java: поиск вложенного потока по нескольким спискам выбрасывает NPE - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующий код в Java 7:

List<Integer> idMappers= new ArrayList<>();

//getting information from a Map<String, List<String>>
List<String> ids= idDataStore.lookupId(id); 

 for (int i = 0; i < ids.size(); i++) {

 //getting information from a Map<String, List<Integer>>
  List<Integer> mappers= idDataStore.lookupMappers(ids.get(i));

  if (mappers!= null) {
    for (int j = 0; j < x.size(); j++) {
      idMappers.add(mappers.get(j));
    }
  }
}

Я пытаюсь изменить это на Streams

List<Integer> idMappers= new ArrayList<>();
idDataStore.lookupIdMappings(id).forEach(id-> {
  idDataStore.lookupSegments(id).forEach(mapper->{
    idSegments.add(segment);
  });
});

Моя проблема idDataStore.lookupSegments(id) иногда может выдать ноль такмой поток ломается.Как я могу сделать нулевую проверку в Stream?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Во-первых, переменная (id), используемая в лямбде, не может иметь того же имени, что и переменная в той же области действия метода.

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

Я вижу, вы работаете с вложенными для зацикливания, почему бы не использовать Stream::flatMap?

idDataStore.lookupIdMappings(id).stream()
                                .map(i -> idDataStore.lookupSegments(id))
                                .filter(Objects::nonNull)
                                .flatMap(List::stream)
                                .collect(Collectors.toList());
0 голосов
/ 02 октября 2018

Просто добавьте idDataStore.lookupSegments(id).stream().filter(Objects::notNull) к вашему вложенному циклу.

Однако у вас есть побочный эффект (см. Раздел о побочных эффектах), и не рекомендуется заполнять список idMappers.Позвольте мне попытаться конвертировать, используя flatMap

List<Integer> idMappers = idDataStore.lookupIdMappings(id)
           .stream() // stream of LookupId's
           .flatMap(idMapping -> idDataStore
                                .lookupSegments(id)
                                .stream()
                                .filter(Objects::notNull)
                                // get stream of corresponding lookupSegments
                                // and filter out all nulls
           )
           .collect(Collectors.toList());

Надеюсь, это поможет.

...