2015-07-24 2 views
14

Ho seguito semplice codice che sto cercando di convertire in stile funzionaleSostituzione if-else all'interno di 'per' i loop con Java-8 Streams

for(String str: list){ 
    if(someCondition(str)){ 
     list2.add(doSomeThing(str)); 
    } 
    else{ 
     list2.add(doSomethingElse(str)); 
    } 
} 

E 'facilmente possibile sostituire questo ciclo con il flusso? L'unica opzione che vedo è quella di eseguire iterazioni sul flusso due volte con due diverse condizioni di filtro.

+3

E perché vuoi farlo se il tuo codice funziona? – fge

+4

È possibile utilizzare una mappa con un'istruzione condizionale 'Elenco list2 = list.stream(). Map (str -> someCondition (str)? DoSomeThing (str): doSomethingElse (str)). Collect (toList());' . Che sia più leggibile o meno dipende dal lettore (lo trovo chiaro personalmente). Puoi sempre estrarre questo processo in un metodo di supporto, se lo desideri. –

+1

@fge solo per capire meglio la programmazione funzionale in Java :) – sidgate

risposta

23

suona come si può semplicemente utilizzare map con una condizione:

List<String> list2 = list 
    .stream() 
    .map(str -> someCondition(str) ? doSomething(str) : doSomethingElse(str)) 
    .collect(Collectors.toList()); 

breve ma completo esempio la mappatura brevi stringhe in minuscolo e quelli lunghi a lettere maiuscole:

import java.util.*; 
import java.util.stream.*; 

public class Test { 

    public static void main(String[] args) { 
     List<String> list = Arrays.asList("abC", "Long Mixed", "SHORT"); 
     List<String> list2 = list 
      .stream() 
      .map(str -> str.length() > 5 ? str.toUpperCase() : str.toLowerCase()) 
      .collect(Collectors.toList()); 
     for (String result : list2) { 
      System.out.println(result); // abc, LONG MIXED, short 
     } 
    } 
} 
+12

Dato che stiamo eseguendo Java 8, potremmo scrivere anche la registrazione in questo modo: list2.forEach (System.out :: println); –