아이템 48. 스트림 병렬화는 주의해서 적용하라. 스트림 병렬화는 paralle() 메서드를 호출해서 할 수 있음. 스트림 병렬화를 할 때는 Spliterator 객체의 trySplit() 메서드를 호출해서 각 쓰레드별로 진행할 작업을 나눔. 객체별로 고유한 Spliterator가 구현되어 있지 않으면, Stream 클래스의 Spliterator를 사용함. 병렬 스트림이 효율적이지 않은 경우 작업을 효율적으로 나누지 못하는 경우. (Spliterator가 없는 경우, 자료구조가 적합하지 않은 경우) 데이터 소스로 Stream.iterate를 사용하는 경우. 스트림 중간에 limit()을 사용하는 경우 병렬 스트림이 효율적인 경우 작업 나누기 쉬운 자료구조 + 참조 지역성이 좋은 경우. 예를 들면 배열, ..
Collectors 요약 stream의 collect() 메서드에는 Collectors 패키지와 관련된 것들을 요구한다. 이 때, Collectors로 할 수 있는 일들을 간략히 요약하면 다음과 같다. counting maxBy, minBy summingInt, summingLong, summingDouble averagingInt, averagingLong, averagingDouble summarizingInt, summarizingLong, summarizingDouble joining toList, toSet, toCollection 다수준 그룹화 groupingBy, collectingAndThen 분할 partitioningBy Collector를 이용한 count() 연산 final User..
아이템 46. 스트림에는 부작용 없는 함수를 사용하라. 스트림은 함수형 프로그래밍의 패러다임을 의미한다. 이 패러다임을 받아들여야 Stream의 이점을 가져갈 수 있음. 스트림은 일련의 계산을 변환(Transforming)하며 순차적으로 처리한다. 일련의 계산들은 순수함수들에 의해서 처리되어야 함. forEach()를 이용해 외부 객체의 상태를 업데이트 하는 작업을 하지 마라. (순수함수가 아니게 됨) 대신, Stream Collectors가 제공하는 함수 객체들을 이용해 업데이트 대신 새로운 Collection을 만들어라. Stream을 사용할 때는, Collectors가 제공하는 함수 객체를 잘 사용하자. toMap() toSet() toCollection() groupingBy() groupingB..
메서드 이름을 신중히 짓자 메서드 이름을 지을 때는 항상 표준 명명 규칙을 따라야 함. of(), newInstance() 같은 것들. 이해할 수 있고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 중요함. 클래스 / 인터페이스에 편의 메서드를 너무 많이 만들지 말자 메서드가 너무 많은 클래스는 사용/공부/문서화/테스트/유지보수하기 어려움. 인터페이스에 너무 많은 메서드가 존재하면, 구현하기 어려움. 매개변수 목록은 짧게 유지하자 매개변수는 4개 이하로 만들자. 그 이상이 되면, 메서드 호출에 어떤 매개변수가 필요했는지 기억하기 어려움. 만약 같은 타입의 매개변수가 연속되었을 때, 위치가 살짝 바뀌어도 컴파일되어 오류가 발생할 수 있음. 매개변수 목록을 짧게 줄여주는 방법 여러 메서드로 쪼개기 쪼개..
아이템 76. 가능한 한 실패 원자적으로 만들어라. 실패 원자성이란 실패 전후로 객체의 상태가 바뀌지 않는 것을 의미함. 실패한 후, 프로그램이 계속 진행된다면 이 때는 실패 원자적으로 만드는 것이 좋음. 실패 원자성 구현 방법 불변 객체로 만듦. 가변 객체의 경우 매개변수의 유효성 검사. 실패할 가능성이 있는 모든 코드를 객체의 상태를 바꾸는 코드보다 앞에 배치. 임시 복사본에서 작업 수행 후, 작업 성공되면 원래 객체와 교환하기 실패 원자성을 보장하지 않아도 되는 경우 실패 원자성을 달성하기 위한 연산의 비용 / 복잡도가 클 경우. ConcurrentModificationException이 발생한 경우. → 이미 콜렉션은 변했기 때문에 어떻게 할 수가 없음 실패 원자성이란? 특정 객체의 메서드를 실행..