Как при помощи 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 шт):
Если 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]);
}
Можно сделать, например, так:
String[] strings = IntStream
.range(5, 100)
.boxed()
.map(String::valueOf)
.toArray(String[]::new);
Сделать я взял стрим от Integer просто как пример. Далее мы преобразуем все в строку и последней строчкой говорим, что нам нужен именно массив.