2015-04-29 5 views
1

Existe-t-il un moyen de combiner les deux commandes ci-dessous en une seule ligne, où j'initialise ArrayList à l'aide de la boucle for?Java Initialize ArrayList à partir de For-Loop

ArrayList<KSE> kseList = new ArrayList<KSE>(); 
for (KSE k : allKSEs) if (k.isKeyPress()) kseList.add(k); 

La allKSEs variables est juste un générique Collection

Collection<KSE> allKSEs = KSE.parseSessionToKSE(ksListString); 
+0

Si vous initialisez la ArrayList dans votre boucle, ne sera pas son contenu sont supprimés ou écrasés à chaque itération de la boucle? –

+1

Parfois, la lisibilité vaut une ou deux lignes de plus. (Personnellement, je n'aime même pas le one-line-for-if) – Enrichman

Répondre

3

En Java 8, vous pouvez utiliser la nouvelle streaming syntax:

List<KSE> kseList = allKSEs.stream() 
    .filter(KSE::isKeypress) 
    .collect(Collectors.toList()); 

pré-Java 8, ce que vous avez est ce que J'écrirais, même si je ne condenserais pas la boucle en une seule ligne.

+0

Malheureusement, le projet est écrit en Java 7. Je n'ai pas la possibilité de changer cela. –

+0

Je sais que ce n'est pas le bon style de condenser la boucle à une ligne. J'essayais juste de le rendre aussi compact que possible. –

0

Si vous utilisez encore Java 7, vous pouvez utiliser Apache CollectionUtils, Apache BeanUtils et le code suivant:

ArrayList<KSE> kseList = CollectionUtils.select(allKSEs, new BeanPropertyValueEqualsPredicate("keyPress", true));