Como posso pular a chamada de limite (número) com um fluxo quando o número é igual a 0?

19

Eu tenho algum código Java que fornece objetos de items. Limita-os com base no maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

Funciona corretamente, mas a pergunta é a seguinte: existe uma maneira de pular o limite quando o maxNumber == 0?

Eu sei que eu poderia fazer isso:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

Mas talvez haja uma maneira melhor, alguma coisa vem à sua mente?

randomuser1
fonte

Respostas:

15

eu suponho que

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

fará o truque, pois é altamente improvável que você lide com um fluxo com mais de 2 ^ 63-1 elementos ...

Pelo menos tenha cuidado com fluxos paralelos sobre isso ... Uma observação nos documentos da API diz:

Nota da API : Embora limit()geralmente seja uma operação barata em pipelines de fluxo sequencial, pode ser bastante cara em pipelines paralelos ordenados, especialmente para grandes valores de maxSize ...

Jean-Baptiste Yunès
fonte
sim, isso fez o truque, obrigado!
randomuser1 12/03
20

Não, o pipeline de fluxo não permite realmente pular nenhuma parte do pipeline; portanto, você é forçado a trabalhar com lógica condicional dentro das etapas e incluindo o limit()sempre no pipeline ou construindo o fluxo em partes que seriam um pouco mais legível (IMHO) do que o if / else na questão

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

Em um caso simples, como aqui, não faz muita diferença, mas muitas vezes você vê em coleções de código regulares sendo passadas por métodos, convertidas em fluxos e depois voltando a coleções. Nesses casos, pode ser uma idéia melhor trabalhar com fluxos de peças até que você realmente precise collect().

Kayaman
fonte