Próbuję kilku metod scala.Stream
i zdefiniował taką metodę:
def my(n: Int) = {
scala.Stream.from(1).flatMap { i =>
println("### " + i)
scala.Stream.from(i).takeWhile(_ < 10).map(j => (i, j))
}.take(n).filter(x => x._1 < 3 && x._2 < 5).toList
}
Jeśli dam n
numer 45
:
println(my(45))
Który kończy się bardzo szybko i drukuje:
### 1
### 2
### 3
### 4
### 5
### 6
### 7
### 8
### 9
List((1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4))
Ale jeśli n
jest 46
nigdy się nie skończy:
### 1
### 2
### 3
### 4
### 5
### 6
...
### 245684
### 245685
### 245686
### 245687
### 245688
### 245689
### 245690
### 245691
...
Dlaczego to takie dziwne?
PS: moja wersja Scala to 2.11.7
Odpowiedzi:
3 dla odpowiedzi № 145-tym wpisem w wyniku płaskiej mapy jest (9,9). Jest to ostatnia krotka, którą można wygenerować z liczby i <10. Aby wygenerować 46 krotkę, kod próbuje następnie i = 10, ale Stream.from(i).takeWhile(_ < 10)
nie zwraca poprawnych krotek, więc kod natychmiast przechodzi do i = 11 i tak dalej, podając drukowane linie, które widzisz, ale nigdy nie generuje nowego elementu dla strumienia ...