it-roy-ru.com

Java 8 Stream сортировка списка строк

Я вызываю отсортированный метод в потоке. И документ Java говорит:

«Метод Sorted возвращает поток, состоящий из элементов этого потока, отсортированных по естественному порядку.»

Но когда я запускаю код ниже:

List<String> list = new ArrayList<String>();
list.add("b");
list.add("a");
list.add("z");
list.add("p");
list.stream().sorted();
System.out.println(list);

Я получаю вывод как

[b, a, z, p]

Почему я не получаю вывод естественного вида?

6
saurabh suman

Правка это

list.stream().sorted();
System.out.println(list);

что-то вроде

list.stream().sorted().forEachOrdered(System.out::println);

Ваш метод println в list (не отсортированный поток). В качестве альтернативы (или дополнительно) вы можете сократить процедуру инициализации и повторно собрать List like

List<String> list = new ArrayList<>(Arrays.asList("b","a","z","p"));
list = list.stream().sorted().collect(Collectors.toList());
System.out.println(list);

Какие результаты (как вы, вероятно, ожидали)

[a, b, p, z]
11
Elliott Frisch

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

    List<String> list = new ArrayList<String>();
    list.add("b");
    list.add("a");
    list.add("z");
    list.add("p");
    list = list.stream().sorted().collect(Collectors.toList());
    System.out.println(list);
5
Morozov Ivan

Если вы хотите иметь свой отсортированный список.

Давайте изменим это 

list.stream().sorted();

в 

list.sort((e1, e2) -> e1.compareTo(e2));

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

3
David Pham

В вашем потоке нет оператора терминала, и поэтому он не обрабатывается. Терминальные операторы включают, но не ограничиваются: forEach, toArray, Reduce, Collect. Ваш сегмент кода должен быть похож на

list.stream().sorted().forEachOrdered(System.out::println);
3
user6929867