orElse는 T객체 그 자체를, orElseGet은 람다식을 넘길 수 있다는 차이가 있다.
//orElse
UserStatistics one = statistics.stream().filter(UserStatistics::isHoldem).findFirst().orElse(new UserStatistics());
//orElseGet
UserStatistics one = statistics.stream().filter(UserStatistics::isHoldem).findFirst().orElseGet(() -> new UserStatistics());
또한 메모리/성능 상에서 차이도 있다.
orElse 는 값이 존재하여 else에 설정한 값을 반환하지 않게 될 때에도 이미 만들어 놓는다.
orElseGet은 값이 없어 진짜 필요할 때 실행된다.
따라서,
constant, static variable, or caching result 을 반환할 경우라면 orElse를 사용해도 되지만, 대량 작업을 하거나 새로운 객체를 생성해야할 경우 orElseGet를 사용하는게 좋겠다.
public static <T> void assertThat(T actual, Matcher<? super T> matcher)
TypeSafeMatcher를 상속받아서 매처 인스턴스를 반환하는 정적 팩토리 매서드(static @Factory method)를 제공하는 방식으로 커스텀 매쳐를 만들 수 있음(ConstrainsSidesTo.java, RectangleTest.java)
7.3.2 불변 함수를 내장하여 범위 테스트
sparseArray라는 자료구조를 직접 구현
내부 배열에 저장된 값을 검증하는 테스트 코드를 작성할 때
불필요하게 내부 구현 사항을 노출하기보다
검증 함수를 만들어서 활용하는게 낫다(테스트 코드에서도 쓰고, 필요시 로직에서도 쓰고; checkInvariants())
이 때 코드의 어느 부분에 문제가 있는지 더 쉽게 파악 가능
cf. sparseArray
0이 데이터보다 훨씬 많이 있는 array. 0을 실제 저장하지 않고 데이터가 있는 값만을 특별한 형식으로 저장하여 메모리를 효율적으로 사용하려는 방법을 취함.
A sparse array is an array of data in which many elements have a value of zero. This is in contrast to a dense array, where most of the elements have non-zero values or are “full” of numbers. A sparse array may be treated differently than a dense array in digital data handling.