Scala: Was ist der Unterschied zwischen filter und takeWhile in einem Stream?

7

Ich habe gerade begonnen, Scala zu lernen, und ich bin verwirrt zwischen dem Filter und takeWhile während der Arbeit an Streams.

Ich bin auf dieses Programm gestoßen, um Primzahlen zu generieren, die sowohl takeWhile als auch Filter für einen Stream verwenden.

%Vor%

Beim Experimentieren fand ich

%Vor%

gibt mich zurück

%Vor%

während

%Vor%

läuft unendlich.

    
AbrahamDaniel 03.02.2016, 12:15
quelle

2 Antworten

9

Der Unterschied ist nicht streamspezifisch, sondern für alle Sammlungen, die erweitern GenTraversableLike :

filter

  

Gibt alle Elemente zurück, die das Prädikat p

erfüllen

takeWhile

  

Gibt das längste Präfix zurück, dessen Elemente das Prädikat p erfüllen.

z. B.

%Vor%

Insbesondere endet Stream.from(1).filter(_ < 10).toList nicht, weil es jedes Element des Streams überprüfen muss: es "weiß" nicht, dass es keine Elemente geben wird, die _ < 10 nach 9 (und tatsächlich dort) erfüllen sind, dank wraparound).

    
Alexey Romanov 03.02.2016, 13:15
quelle
11

takeWhile() stoppt die Auswertung sofort, nachdem die Bedingung nicht erfüllt wurde.

filter müssen den gesamten Stream auswerten.

Ich empfehle Ihnen, diese zwei Funktionen im unteren Code zu analysieren:

Ссылка

    
PawelN 03.02.2016 12:27
quelle

Tags und Links