Как из листа стрингов сделать лист объектов через обработку Stream?
Нужно из существующего листа стрингов сделать лист объектов Region, где id=порядковый номер, а name=буквенное значение. На выходе при таком коде region.size() = 0. Помогите найти ошибку.
class Region {
Long id;
String name;
public Region(Long id, String name) {
this.id = id;
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
List<String> bufreg = new ArrayList<>();
bufreg.add("1. EU/");
bufreg.add("2. RU/");
bufreg.add("3. ASIA/");
List<Region> regions = bufreg.stream()
.map(i -> i.split("."))
.filter(a -> a.length == 2)
.map(a -> new Region(Long.valueOf(a[0]), a[1].trim()))
.collect(Collectors.toList());
System.out.println(regions);
}
}
Ответы (2 шт):
Автор решения: azlov
→ Ссылка
Метод split() принимает регулярное выражение, . - метасимвол для поиска "любого символа". Если точка - разделитель, вам необходимо экранировать символ:
.map(i -> i.split("\\."))
Автор решения: Alexandr
→ Ссылка
Можно воспользоваться регулярными выражениями:
package com.somepackage;
import lombok.AllArgsConstructor;
import lombok.ToString;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class Main {
@AllArgsConstructor
@ToString
static class Region {
Long id;
String name;
}
public static void main(String[] args) {
final var bufreg = List.of("1. EU/", "2. RU/", "3. ASIA/");
final var pattern = Pattern.compile("(\\d+)\\.\\s+([^/]+)/");
List<Region> regions = bufreg.stream()
.map(e -> {
final var matcher = pattern.matcher(e);
if (matcher.matches()) {
final var id = matcher.group(1);
final var name = matcher.group(2);
return new Region(Long.parseLong(id), name);
}
return null;
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
System.out.println(regions);
}
}
Вывод:
[Main.Region(id=1, name=EU), Main.Region(id=2, name=RU), Main.Region(id=3, name=ASIA)]