J'ai une classe Test
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 } }
J'ai une liste d'objets de test
List<Test> testObj1("A", ....) testObj2("B", ....) testObj3("C", ....) list1.stream().collect(Collectors.toList())
Tentative de conversion de cette liste1 à la nouvelle
list2
avec chaque code A, B, C ... à son propre objet en conservant les champs restants.
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", ...)
J'ai réalisé cela en utilisant des boucles (code Sudo) mais à la recherche d'une meilleure logique
public class Test{ String codes; String field 1; .... String field n; }
3 Réponses :
Vous pouvez simplifier cela en:
List<Test> copy = list.stream() .map(e -> Arrays.stream(e.codes.split("")) .map(c -> new Test(c, e.otherField)) .collect(Collectors.toList())) .findAny().orElse(...);
Qui diffusera via la liste donnée, puis diffusera via le Array
généré par split () code> et mappez sur un nouvel objet
Test
et collectez-le dans une Liste
. Il le récupère via findAny ()
, qui renvoie un Optional
, donc je recommanderais d'utiliser >
orElse
pour récupérer un défaut valeur.
Vous pouvez utiliser une fonction map
puis flatMap
comme ceci:
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);
Je crois qu'OP voulait une List
pas une List
Vous pouvez utiliser Stream.map
avec flatMap
comme:
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 }
Cela suppose que votre Test
class aurait un constructeur similaire à l'implémentation suivante:
List<Test> finalList = list1.stream() .flatMap(e -> Arrays.stream(e.getCodes().split(",")) .map(c -> new Test(c, e.getField1(), e.getFieldn()))) .collect(Collectors.toList());
Qu'entendez-vous par «mieux»?
Je voulais dire utiliser Java Streams
À l'avenir, veuillez être explicite sur ce que vous demandez. Je ne peux pas savoir par votre question s'il y a eu des problèmes de performances, des problèmes de mémoire, des problèmes de correction ...