2017-10-10 3 views
-1

Je suis nouveau dans Streams et Lambda en Java. J'ai une variable comme ceci -Extraction de sous-chaînes avec Stream en Java

List<String> lines = Arrays.asList("ab,12,bd","df,23,df","ef,98,dg"); 

Je voulais que ces actions se produisent.

  1. Divisez chaque élément de la liste.
  2. Extrait le 2e élément du tableau résultant. (c'est chiffres)
  3. Appliquez une certaine fonction dessus. Pour simplifier, je voulais le multiplier par 2.
  4. Ensuite, collectez le résultat sous forme de liste, c'est-à-dire contenant 24,46,196.

    J'ai essayé de le faire dans les flux, mais je ne suis pas en mesure d'obtenir. Tous les pointeurs seront utiles. Je vous remercie.

Edit: Je essayé de cette façon et a obtenu résultat -

List<Integer> result1 = lines.stream() 
          .map(l -> l.split(",")[1]) 
          .map(l->Integer.parseInt(l)) 
          .collect(Collectors.toList()); 

et a obtenu des résultats comme

[12, 23, 98] 

Est-ce est une façon correcte de faire cours d'eau?

+1

S'il vous plaît montrer votre tentative actuelle pour mieux illustrer votre description. –

+0

Vous avez essayé quelque chose? Partagez-le, cela aide à comprendre ce que vous n'êtes pas capable de résoudre. – nullpointer

+0

Ont ajouté mon code .. –

Répondre

1

Cela devrait être simple.

lines.stream().map(s -> Integer.parseInt(s.split(",")[1]) * 2).collect(Collectors.toList()); 

Mise à jour basé sur la question mise à jour

Est-ce est une façon correcte de faire cours d'eau?

Oui. Vous pouvez combiner les deux opérations map en une seule comme je l'ai montré ci-dessus.

+0

Utiliser la méthode split() ici est moins performant que de simplement utiliser une regex car elle crée un tableau supplémentaire avec tous les éléments quand on en veut un seul. – Tet

+0

@Tet: vous pouvez spécifier une limite à 'split' pour éviter un travail inutile. Dans ce cas, il peut être encore plus efficace que regex, car 'String.split' a un chemin rapide pour les modèles de char simple. Mais si les performances importent vraiment, écrire une méthode dédiée en utilisant 'indexOf' et' substring' pourrait être encore plus rapide. – Holger

1

Est-ce que ce qui suit fonctionne pour vous?

lines.stream().map(s -> s.split(",")[1]) 
    .map(Integer::parseInt) 
    .map(f) 
    .collect(Collectors.toList()); 

f est votre fonction de Integer du type que vous souhaitez utiliser dans votre liste finale.

+0

L'utilisation de la méthode split() est moins efficace que l'utilisation d'une regex car elle crée un tableau supplémentaire avec tous les éléments quand nous voulons juste un élément – Tet

1

Qu'en est-:

List<Integer> result = lines.stream() 
    .map(line -> line.replaceFirst(".*,(\\d+),.*", "$1")) 
    .map(num -> 2 * Integer.parseInt(num)) 
    .collect(Collectors.toList()); 

Vous pouvez convertir int[] en ce cas, vous pouvez utiliser:

int[] result = lines.stream() 
    .map(line -> line.replaceFirst(".*,(\\d+),.*", "$1")) 
    .mapToInt(num -> 2 * Integer.parseInt(num)) 
    .toArray();