Search
Duplicate
📒

[Java Study] 10-x. Lazy Evaluation(게으른 연산)

상태
미진행
수업
Java Study
주제
4 more properties

핵심

NOTE
Lazy Evaluation → 게으른 연산 ( 불필요한 연산을 피하기 위해 지연시킴 )
두 방식의 차이
왼쪽 → Filter 함수에 대해서 모두연산 → 그중 최소값 3개 선택
오른쪽 → Filter 함수에 대해서 모두연산하지 않고 3개가 나오면 바로 끝냄
Eager Evaluation
Lazy Evaluation

내용

1. Lazy 코드의 동작방식

아래의 코드는 1~10까지의 정수 List이고 6보다 작고 짝수인 숫자를 10배 시킨 리스트 출력하는 코드이다
final List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); System.out.println( // 20, 40 list.stream() .filter(i -> i<6) .filter(i -> i%2==0) .map(i -> i*10) .collect(Collectors.toList()) );
Java
복사
NOTE
이 함수의 코드 동작 방식을
1~10까지 6보다 작은 값들을 구하고
1번에서 구한 요소들 중 짝수인 값을 구하고
2번에서 구한 요소들에 10을 곱해준다
→ 이 방식이 아니다 ( 이러한건 Eager Evaluation(조급한 연산) )

2. 실제로 동작하는 방식 확인

실행순서를 알아보기 위해 다음과 같이 코드를 수정함
final List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); System.out.println( list.stream() .filter(i -> { System.out.println("i < 6"); return i < 6; }) .filter(i -> { System.out.println("i%2 == 0"); return i % 2 == 0; }) .map(i -> { System.out.println("i = i*10"); return i * 10; }) .collect(Collectors.toList()) );
Java
복사
NOTE
각 요소들에 대해서 이 과정을 반복한다
1.
6보다 작은지 검사
2.
짝수인지 검사
3.
요소에 10을 곱해줌
6보다 작은수의 경우 짝수인지 판별하는 함수로 넘아가나 6~10은 바로 다음숫자로 감
Lazy 방식은 당장에 해결해야할 문제들이 있더라도 마지막 문제를 받을때 까지 게으르게 기다리다가 마지막 문제를 알게되었을 때 연산을 시작해서 불필요한 연산을 수행하지 않음
더 극단적인 예시를 들어본다
final List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); System.out.println( list.stream() .filter(i -> { System.out.println("i < 6"); return i<6; }) .filter(i -> { System.out.println("i%2 == 0"); return i%2==0; }) .map(i -> { System.out.println("i = i*10"); return i*10; }) .findFirst() .get() );
Java
복사
NOTE
처음한 코드와 차이는 findFirtst() 하나이다
1 검사 → 통과 못함
2 검사 → 모두 통과 → 첫번째 값만 구하면되므로 이대로 연산끝내고 출력