2017-10-11 3 views
4

Le code ci-dessous, prend un flux, le trie. S'il y a une limite maximale qui devrait être appliquée, elle l'appliquera.Les flux Java limitent les éléments de la collection en fonction de la condition

if(maxLimit > 0) { 
    return list.stream().sorted(comparator).limit(maxLimit).collect(Collectors.toList()); 
} else { 
    return list.stream().sorted(comparator).collect(Collectors.toList()); 
} 

//maxLimit, list, comparator can be understood in general terms. 

Ici, à l'intérieur de if, l'opération de limite est présente et dans else, elle n'est pas présente. Les autres opérations en cours sont identiques.

Est-il possible d'appliquer une limite lorsque maxLimit est supérieur à zéro. Dans le bloc de code présenté ci-dessus, la même logique est répétée, sauf le fonctionnement en limite dans un bloc.

+0

pourrait-il être fait avec Java 9 ' takeWhile() '? Je suppose que la réponse est non, puisque takeWhile fonctionne sur le flux et est apatride ....!? – schneida

Répondre

5
list.stream().sorted(comparator).limit(maxLimit>0 ? maxLimit: list.size()).collect(Collectors.toList()) 

Regarder la mise en œuvre actuelle de la limite je crois qu'il vérifie si la limite est inférieure à la taille actuelle de sorte ne serait pas aussi inefficace que je prévu initialement

+1

Correct et une bonne idée, personnellement j'irais avec la solution @ szymon-stepniak car il est plus facile à lire et toujours concis ... – schneida

+0

Merci. Code concis. Solution souhaitée est pour la question est pointée ici. – Shashi

11

Vous pouvez diviser votre code en parties comme:

final Stream stream = list.stream() 
     .sorted(comparator); 

if (maxLimit > 0) { 
    stream = stream.limit(maxLimit); 
} 

return stream.collect(Collectors.toList()); 

Dans ce cas, vous ne devez pas maintenir deux branches comme dans votre exemple initial.

De même, lors de l'affectation de la variable stream, il est utile d'utiliser un type générique spécifique, par ex. si list est un List<String>, puis utilisez le type Stream<String> pour une variable stream.

+0

Bien que le code soit divisé, l'opération sur le flux est une seule fois. Même si le code a été divisé, une seule opération sur la liste est nécessaire. Cette solution est sympa. – Shashi