Получить Pojo из списка Java, используя параллельный поток без использования какого-либо индекса - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть список Java:Я могу добиться этого, выполнив что-то вроде этого:

for (FilePojo filePojo : list){
    System.out.println(filePojo.getId()+" "+filePojo.getName());
}

А потом я наткнулся на Stream api и попытался изменить свой код следующим образом:

Stream.of(list).parallel().forEach(filePojo -> {
        System.out.println(filePojo);
        }
    });

Используя это, я не могу получить доступ кgetters from filePojo (в отличие от первого метода), хотя я могу видеть объекты вроде этого:

[pojo.FilePojo@56528192, pojo.FilePojo@6e0dec4a, pojo.FilePojo@96def03, pojo.FilePojo@5ccddd20, pojo.FilePojo@1ed1993a, pojo.FilePojo@1f3f4916, pojo.FilePojo@794cb805, pojo.FilePojo@4b5a5ed1]

Я могу получить доступ к геттерам, если использую такой индекс:

Stream.of(list).parallel().forEach(filePojo -> {
        for (int i = 0; i < list.size(); i++) {
            System.out.println("=============================\n" + "Element at " + i + "\n" + filePojo.get(i).getId() + "\n" + filePojo.get(i).getCustomerId() + "\n" + filePojo.get(i).getFileName() + "\n ========================");
        }

    });

IsМожно ли получить Pojo из потока списка без использования индекса (аналогично первому способу)?или мне нужно прибегнуть к индексации для решения этой проблемы?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вы можете сделать это с помощью потоков как:

list.stream() // Stream<FilePojo>
    .map(filePojo -> filePojo.getId() + " " + filePojo.getName())
    .forEach(System.out::println);

Используя Stream.of, вам потребуется flatMap поток, поскольку в итоге вы создаете Stream<List<FilePojo>> вместо

Stream.of(list) // Stream<List<FilePojo>>
      .flatMap(List::stream) // Stream<FilePojo>
      .map(filePojo -> filePojo.getId() + " " + filePojo.getName())
      .forEach(System.out::println);

Подробнее читайте : Должен ли я всегда использовать параллельный поток, когда это возможно?

0 голосов
/ 03 декабря 2018

Конечно, вы можете создать «поток», отобразить его, затем распечатать:

list.stream()
    .map(filePojo -> filePojo.getId() + " " + filePojo.getName())
    .forEach(e -> System.out.println(e));

Stream.of(list) читается как «создать поток списков», но вам нужно «создать поток элементов»в списке "отсюда и list.stream выше.

Кроме того, неосторожно звоните Stream.of(list).parallel(), если вы не уверены, что сможете извлечь выгоду из параллельной обработки, это может вернуться к укусам хужепроизводительность, чем последовательный подход.

, но на самом деле, если все, что вам нужно, это выше, то в этом нет необходимости, просто продолжайте свой подход или выполните:

list.forEach(f -> System.out.println(f.getId()+" "+f.getName()));

, так как списки имеютforEach метод.

0 голосов
/ 03 декабря 2018

Вы неправильно используете метод Stream.of (), вы создаете поток списков, а не объектов внутри него.

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

list.stream()
.parallel()
.forEach(filePojo -> System.out.println(filePojo.getId() + " " + filePojo.getName()));
...