Как при помощи Stream API получить массив String?

Имеется следующий метод:

public static List<String> getMessageOfBindingResult(BindingResult result) {
    return result.getFieldErrors().stream()
            .map(fe -> String.format("[%s] %s", fe.getField(), fe.getDefaultMessage()))
            .collect(Collectors.toList());
}

Появилась необходимость возвращать массив String[] вместо списка List<String>. В Stream API есть терминальная операция toArray(), но она возвращает массив Object. Пока что я сделал вот так:

public static String[] getMessagesOfBindingResult(BindingResult result) {
        List<FieldError> errors = result.getFieldErrors();
        String[] messages = new String[errors.size()];
        for (int i = 0; i < errors.size(); i++) {
            messages[i] = String.format("[%s] %s", errors.get(i).getField(), errors.get(i).getDefaultMessage());
        }
        return messages;
    }

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

Есть ли какая-то возможность получить именно массив String[] при помощи Stream API?


Ответы (2 шт):

Автор решения: Aziz Umarov

Если Stream APi то предложу так

public static void main(String[] args) {
    List<String> list = new ArrayList<>();

    list.add("String1");
    list.add("String2");
    list.add("String3");
    list.add("String4");

    String[] result = list.stream().collect(Collectors.toList()).toArray(new String[0]);

    for (String string : result) {
      System.out.println(string);
    }
  }

а если нет то так

public static void main(String[] args) {
    List<String> list = new ArrayList<>();

    list.add("String1");
    list.add("String2");
    list.add("String3");
    list.add("String4");

    String[] result = list.toArray(new String[0]);

    for (String string : result) {
      System.out.println(string);
    }
  }

Идея у обоих одна и таже использовать toArray

В вашем случае это будет так

public static String[] getMessageOfBindingResult(BindingResult result) {
    return result.getFieldErrors().stream()
            .map(fe -> String.format("[%s] %s", fe.getField(), fe.getDefaultMessage()))
            .collect(Collectors.toList()).toArray(new String[0]);
}
→ Ссылка
Автор решения: faoxis

Можно сделать, например, так:

String[] strings = IntStream
    .range(5, 100)
    .boxed()
    .map(String::valueOf)
    .toArray(String[]::new);

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

→ Ссылка