2017-01-20 44 views
13

Tembel değerlendirme kavramına yeni katılıyorum. Scala'da bu kod satırını çalıştırdığımda;Scala Stream - Java Stream Laziness Farkı

"12334".grouped(1).toStream.filter{n => println("n:" +n); n=="3";} 

Dışarı yazdırır: sessizce çizgiyi konsola şey yazmadan

List<String> myList = new ArrayList<>(Arrays.asList("12334".split(""))); 

Stream<String> myList2 = myList.stream().filter(a -> {System.out.println("a:" +a);return "3".equals(a);}); 

O sonlandırır:

n:1 
n:2 
n:3 

Ama böyle Java benzer bir şey, çalıştırdığınızda. Java'nın davranışı bana göre daha mantıklı geliyor çünkü Akımlar tembel bir şekilde değerlendiriliyor ve topladım ya da sonucu yazdırmaya çalışmıyorum. Fakat Scala'da akış tüketmediysem bile bazı bilgileri basar. Yani benim sorum bu farklılığa neden olan şey nedir?

cevap

10

filter'un tamamen tembel olmaması gerçeğinden kaynaklanmaktadır. materyalizasyonu ve Stream fiili filtreleme neden

while (!rest.isEmpty && !p(rest.head)) rest = rest.tail 

: Bu kod parçası vardır. Eğer tam tembelliğe istiyorsanız

, withFilter ile gitmek daha fazla withFilter instead of filter bakınız

"12334".grouped(1).toStream.withFilter { n => println("n:" +n); n=="3"; } 

için.

İlgili konular