Разделение запятых строковых значений при потоковой передаче в java 8 - PullRequest
3 голосов
/ 17 апреля 2020

У меня есть поле String с именем userId, в котором значения, разделенные запятыми, такие как String user = "123", "456", я хочу разделить. Я написал что-то вроде этого

List<String> idList= employeeList.stream()
    .map(UserDto::getUserId)
    .filter(Objects::nonNull)
    .map(String::toUpperCase)
    .distinct()
    .collect(Collectors.toList());

Этот UserDto :: getUserId содержит значения, разделенные запятыми. Возможно ли разделение при потоковой передаче в указанных выше логах c.

Спасибо

Ответы [ 5 ]

4 голосов
/ 17 апреля 2020

Я думаю, что это должно работать

List<String> idList= employeeList.stream()
    .map(UserDto::getUserId)
    .filter(Objects::nonNull)
    .map(String::toUpperCase)
    .flatMap(s -> Arrays.stream(s.split(",")))//create a stream of split values
    .distinct()
    .collect(Collectors.toList());
1 голос
/ 17 апреля 2020

Можно разделить его с помощью, и это похоже на

.map(ids -> ids.toUpperCase().split(","))

Но если вы хотите создать новый список с идентификаторами, вы можете просто подать заявку на
1-е решение

List<String> splitted = new ArrayList<>();
list.stream().filter(Objects::nonNull).forEach(it -> splitted.addAll(Arrays.asList(it.toUpperCase().split(","))));

2-е решение

list.stream().filter(Objects::nonNull).map(it -> Arrays.asList(it.toUpperCase().split(","))).flatMap(Collection::stream).collect(Collectors.toList());
1 голос
/ 17 апреля 2020

Просто используйте метод split(...) для String и flatMap(...) до go из потока массивов в поток элементов внутри массивов:

List<String> idList = employeeList.stream()
                .map(UserDto::getUserId)
                .filter(Objects::nonNull)
                .map(userId -> userId.split(",")) //get from the comma separated list to an array of elements
                .flatMap(Arrays::stream) //transform the stream of arrays to a stream of the elements inside the arrays
                .map(String::toUpperCase)
                .distinct()
                .collect(Collectors.toList());
0 голосов
/ 18 апреля 2020

, если вам нужно выполнять разбиение довольно часто, и производительность имеет существенное значение и / или делится на более сложное правило, такое как разделение на , и удаление пробелов с использованием класса Pattern, следует учитывать:

Pattern splitter = Pattern.compile("\\s*,\\s*");
List<String> idList= employeeList.stream()
        .map(UserDto::getUserId)
        .filter(Objects::nonNull)
        .map(String::toUpperCase)
        .flatMap(s -> splitter.splitAsStream(s))
        .distinct()
        .collect(Collectors.toList());
0 голосов
/ 17 апреля 2020

Вот оно:

employeeList.stream()
.map(UserDto::getUserId)
.filter(Objects::nonNull)
.map(ids -> ids.split(","))
.flatMap(Arrays::stream)
.map(String::toUpperCase)
.distinct()
.collect(Collectors.toList());

Посмотрите, как FlatMap работает ;)

...