Методы Java Streams, не влияющие на мой ArrayList? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь выполнить следующие потоковые операции над списком ArrayList с именем parts:

parts
    .stream()
    .map(t -> t.toLowerCase())
    .distinct()
    .sorted()
    .collect(Collectors.toList());

, где parts содержит строки вроде этого:

Adventures
in
Disneyland
Two
blondes
were
going
to
Disneyland
....

За исключениемглядя на отладчик, parts вообще не изменяется.Не уверен, что я пропустил какой-то шаг процесса?

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Это создаст новый список и то, как работает оператор карты.Вы заменяете элементы в потоке новыми объектами, а затем собираете поток в новый список.

Необходимо назначить результат новому списку.

0 голосов
/ 28 февраля 2019

Поток не изменяет источник потока, поэтому вы наблюдаете ожидаемое поведение.

Вы должны захватить результат обработки вашего потока и проверить его в своем отладчике, например.

List<String> result = parts.stream()...
0 голосов
/ 28 февраля 2019

при взгляде на отладчик "части" вообще не меняются

Правильно.Потоки не изменяют элементы коллекции, которая использовалась для создания потока.Поток в конечном итоге возвращает new List, который содержит сопоставленные элементы.Просто создайте переменную и присвойте ей возвращаемое значение ваших потоковых операций:

List<String> modifiedList = parts.stream()
    .map(t -> t.toLowerCase())
    .distinct()
    .sorted()
    .collect(Collectors.toList());
0 голосов
/ 28 февраля 2019

Вы нигде не храните собранный список.Потоки не изменяют коллекцию на месте.

Вы должны сделать:

parts = parts.stream().....;

Редактировать на основе комментариев:

Чтобы получитьArrayList, в отличие от любого List, измените свой коллектор на:

.collect(Collectors.toCollection(ArrayList::new));
...