Java 8: Преобразование массива строк, чтобы иметь первый символ в верхнем регистре и отсортированный порядок - PullRequest
0 голосов
/ 28 апреля 2018

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

String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };

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

[Blue, Green, Magenta, PURPLE, Red, Violet, Yellow]

Наконец, массив должен быть отсортирован (просто добавить операцию sorted()).

Я пытаюсь это, но это не работает:

System.out.println(Arrays.stream(strArray)
                .map((String x) -> {x=(x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
                .sorted()
                .collect(Collectors.toList()));

Я получаю эту ошибку:

The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments ((String x) -> {})

Я уверен, что мне не хватает какой-то мелочи, но я не могу понять, что.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Для этого вы можете использовать Character.toUpperCase () метод.

System.out.println(Arrays.stream(strArray)
            .filter(Objects::nonNull)
            .map(s->Character.toUpperCase(s.charAt(0))+ s.substring(1))
            .sorted()
            .collect(Collectors.toList()));
0 голосов
/ 28 апреля 2018

Вы получаете указанную ошибку компиляции, потому что вы решили использовать лямбда-операторный блок для функции map и решили не включать return оператор.

Функция map преобразует элемент типа T в R, поэтому, если вы решите использовать лямбда-операторный блок , вам нужно будет предоставить return оператор явно , единственный случай, когда вам не нужно предоставлять явный оператор возврата, это если вы используете лямбда-выражение .

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

//copy the array of strings to a list of strings
List<String> stringList = new ArrayList<>(Arrays.asList(strArray));
// remove null
stringList.removeIf(Objects::isNull); 
// do replacing
stringList.replaceAll(s -> Character.isUpperCase(s.charAt(0)) ? 
            s : Character.toUpperCase(s.charAt(0))+ s.substring(1));
// sort the list
tempList.sort(Comparator.naturalOrder()); 
0 голосов
/ 28 апреля 2018

вам нужно вернуть новую строку в методе map () - x s входное значение, и вы должны предоставить сопоставленное значение:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map((String x) -> { return (x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "");})
            .sorted()
            .collect(Collectors.toList()));

немного короче:

    String[] strArray = { "Red", "green", "Blue", "Yellow", "violet", "magenta", "pURPLE" };
    System.out.println(Arrays.stream(strArray)
            .map(x -> x != null ? (x.substring(0,1).toUpperCase() + x.substring(1, x.length())) : "")
            .sorted()
            .collect(Collectors.toList()));
...