Преобразование списка Java в другой, используя потоки Java - PullRequest
0 голосов
/ 18 января 2019

У меня есть класс Test

public class Test{
  String codes;
  String field 1;
  ....
  String field n;
}

У меня есть список тестовых объектов

List<Test> objects, code can be one or more with a comma separated
testObj1("A", "field1".."fieldn")
testObj2("B,C", ...)
testObj3("D,E,F", ....)
testObj4("G", ...)

Попытка преобразовать это list1 в новое list2 с каждым кодом A, B, C ... в свой собственный объект, сохранив оставшиеся поля.

List<Test>
testObj1("A", ....)
testObj2("B", ....)
testObj3("C", ....)

list1.stream().collect(Collectors.toList())

Я достиг этого, используя циклы (код Sudo), но искал лучшую логику

for(loop thru list1){
  String[] codesArr = testObj1.codes.split(",");
  for (String code : codesArr) {
    //Create new Obj 
    Test obj = new Test(code, testObj1.copyotherfields);
    //Add obj to list2
  }
}

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вы можете использовать функцию map, а затем flatMap это будет примерно так:

List<String> testList = Arrays.asList("one,two,three,four", "five", "six", "seven", 
"eight, nine", "ten");

 List<String> reMappedList = testList.stream()
 .map(s -> {
     String[] array = s.split(",");
     return Arrays.asList(array);
 })
 .flatMap(List::stream)
 .collect(Collectors.toList());

 System.out.println(reMappedList);
0 голосов
/ 18 января 2019

Вы можете использовать Stream.map с flatMap как:

List<Test> finalList = list1.stream()
        .flatMap(e -> Arrays.stream(e.getCodes().split(","))
                .map(c -> new Test(c, e.getField1(), e.getFieldn())))
        .collect(Collectors.toList());

Предполагается, что ваш класс Test будет иметь конструктор, похожий на следующую реализацию:

class Test {
    String codes;
    String field1;
    String fieldn;

    // would vary with the number of 'field's
    Test(String codes, String field1, String fieldn) {
        this.codes = codes;
        this.field1 = field1;
        this.fieldn = fieldn;
    }
    // getters and setters
}
0 голосов
/ 18 января 2019

Вы можете упростить это до:

List<Test> copy = list.stream()
                      .map(e -> Arrays.stream(e.codes.split(""))            
                                      .map(c -> new Test(c, e.otherField))
                     .collect(Collectors.toList()))
                     .findAny().orElse(...);

, который будет проходить через заданный список, затем проходить через Array, полученную из split(), и сопоставляться с новым Test объектом и собирать его в List. Он получает его через findAny(), который возвращает Optional<List<Test>>, поэтому я бы рекомендовал использовать orElse для получения значения по умолчанию.

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