Как из листа стрингов сделать лист объектов через обработку 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)]
→ Ссылка