Có cách giải quyết đơn giản. Chỉ cần quấn đuôi dòng đệ quy tiêu dùng của bạn trong một chức năng tiếp nhận luồng qua một bởi tên tham số:
import scala.annotation.tailrec
trait T {
def consume[A](as: => Stream[A]): Unit = {
@tailrec
def loop[A](as: Stream[A]): Unit = {
if (as.isEmpty)()
else loop(as.tail)
}
loop(as)
}
}
object O extends T {
def main(args: Array[String]): Unit =
O.consume(Range(1, 1000000000).toStream)
}
Phương pháp giao nhận sẽ tổ chức một tham chiếu đến một chức năng tính toán một biểu thức kết quả trong số đó là một dòng :
public final class O$ implements T {
public static final MODULE$;
// This is the forwarder:
public <A> void consume(Function0<Stream<A>> as) {
T.class.consume(this, as);
}
. . .
public void main(String[] args) {
consume(new AbstractFunction0() {
public final Stream<Object> apply() {
return package..MODULE$.Range().apply(1, 1000000000).toStream();
}
});
}
}
Nguồn
2014-07-02 03:14:46
Xem thêm http://stackoverflow.com/questions/12529697/how-to-write-non-leaking-tail-recursive-stream-function-in-scala – ron