У меня есть массив и поток, как показано ниже.

String[] names = {"Alex", "Anna", "Abhi", "Some", "Broad", "Dustin", 
                  "amanda", "Hanna", "Steve", "Sydney"};
        
Stream.of(names)
        .sorted()
        .map(String::toLowerCase)
        .filter(x -> x.startsWith("a"))
        .forEachOrdered(System.out::println);
        //I have also tried - .forEach(System.out::println);

Фактический выход:

abhi
alex
anna
amanda

Ожидаемый результат:

abhi
alex
amanda
anna

Что мне здесь не хватает?

6
Ajay Kumar 19 Янв 2021 в 22:01

2 ответа

Лучший ответ

Сначала вы сортируете и только затем применяете toLowerCase к элементам, и поскольку Anna имеет заглавную букву, A будет стоять перед amanda.

Сделайте следующее вместо этого:

Stream.of(names)
        .map(String::toLowerCase)
        .filter(x -> x.startsWith("a"))
        .sorted()
        .forEachOrdered(System.out::println);

Выход:

abhi
alex
amanda
anna
16
dreamcrash 19 Янв 2021 в 22:10

Вам не хватает вызова .sorted() перед forEachOrdered, иначе содержимое потока не будет отсортировано после применения .toLowerCase().

Что делает forEachOrdered, так это запускает функцию для каждого элемента в потоке в том порядке, в котором они находятся в потоке ; он не сортирует сами значения.

5
Billy Brown 19 Янв 2021 в 22:05