2016-10-27 1 views
0

J'essaye de créer un IntStream dans Java 8, dont je voudrais filtrer dehors une autre gamme. Par exemple, si je le tableau suivant:Comment filtrer une série de nombres d'une autre gamme

{1, 2, 3, 4, 5, 6, 7, ..., 20} 

Je voudrais garder tout sauf: {4, 5, 6, 7}

J'ai créé le IntStream suivant:

IntStream.rangeClosed(1, 20); 

Cependant, je voudrais la possibilité de faire une sorte de:

IntStream.rangeClosed(1, 20).filter(IntStream.rangeClosed(4, 7)); 

Y a-t-il un moyen de le faire? Apparemment, il n'y a aucun moyen de le faire, mais je peux me tromper. Merci d'avance pour toute réponse

Répondre

4

Qu'est-ce qui ne va pas avec un simple contrôle de portée?

IntStream.rangeClosed(1, 20).filter(i -> i < 4 || i > 7) 
+0

Merci, je pourrais bien le faire. – DigitalSelf

1

Pourquoi ne pas simplement créer deux flux et concaténer? 1-3 et 8-20?

IntStream.concat(IntStream, IntStream)

En faisant cela, vous passez le contrôle pour chaque élément.

Une autre suggestion est de le convertir en deux sets et faire

range1.boxed().collect(Collectors.toSet()); 
range2.boxed().collect(Collectors.toSet()); 

range1.removeAll(range2); 
+0

Mais peut-être il a l'exigence de filtrer la gamme existante où vous ne connaissez pas les éléments à être supprimés à l'avenir –

+0

Oui, cela peut être le cas, mais il n'a pas été déclaré. Donc je n'ai rien supposé. –

+0

@Ghanshyam Bagul: Je ne vois pas de différence significative entre 'IntStream.concat (IntStream.range (1,4), IntStream.rangeClosed (8,20))' et 'IntStream.concat (IntStream.range (r1, r2), IntStream.rangeClose (e2 + 1, e1)) '. – Holger