2017-01-20 2 views
13

저는 게으른 평가라는 개념에 익숙하지 않습니다. 스칼라에서이 코드 줄을 실행할 때;스칼라 스트림과 Java 스트림 게으름의 차이

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

그것은 출력합니다 : 자동으로 라인을 콘솔에 아무것도 작성하지 않고

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);}); 

그것은 종료 :

n:1 
n:2 
n:3 

을하지만 같은 자바에서 비슷한 일을 실행할 때. Streams가 늦게 평가되어서 나는 결과를 수집하거나 시도하지 않았기 때문에 Java의 동작이 나에게 더 합리적인 것처럼 보입니다. 그러나 스칼라에서 스트림을 소비하지 않더라도 일부 정보가 출력됩니다. 그래서 내 질문은 무엇이 그 차이를 일으키는 것입니까?

답변

10

filter이 완전히 게으른 것은 아닙니다. 구체화하고 Stream의 실제 필터링이 발생

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

: 그것은이 코드 조각이있다. 당신은 전체 게으름을 원하는 경우에

, withFilter로 이동 : 더 withFilter instead of filter를 참조

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

하십시오.