목록책 정리 (74)
초보개발자 긍.응.성
컬렉션 팩토리 기존 작은 컬렉션을 만드는 팩토리 메서드로는 Arrays.asList()가 존재했다. 고정 크기의 리스트를 만들었으므로 요소를 갱신할 순 있지만 새 요소를 추가하거나 요소를 삭제할 순 없다. 예로 요소 추가 시 UnsupportedOperationException이 발생한다. 리스트는 이렇게 팩토리 메서드라고 존재했지만 집합의 경우 리스트를 인수로 받는 HashSet 생성자를 사용하거나 스트림 API를 사용하는 방법이 존재했다. Set elems1 = new HashSet(Arrays.asList("e1","e2","e3")); Set elems2 = Stream.of("e1","e2","e3").collect(toSet()); 두 방법 모두 매끄럽지 못하며 내부적으로 불필요한 객체 할당을..
자바 7은 쉽게 병렬화를 수행하면서 에러를 최소화할 수 있도록 포크/조인 프레임워크(fork/join framework) 기능을 제공한다. 병렬 스트림 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성된다. 병렬 스트림은 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. 따라서 병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수 있다. stream에서 parallel을 호출하면 내부적으로 이후 연산이 병렬로 수행해야 함을 의미하는 불리언 플래그가 설정된다. 반대로 sequential로 병렬 스트림을 순차 스트림으로 바꿀 수 있다. 이 두 메서드를 이용해서 어떤 연산을 병렬로 실행하고 어떤 연산을 순차로 실행할지 제어할 수 있..
Collector (컬렉터) Collector 인터페이스 구현은 스트림 요소를 어떤 식으로 도출할지 지정한다. 훌륭하게 설계된 함수형 API의 장점으로는 높은 수준의 조합성과 재사용성을 꼽을 수 있다. Collector 인터페이스 메서드를 어떻게 구현하느냐에 따라 스트림에 어떤 리듀싱 연산을 수행할지 결정된다. Collectors 유틸리티 클래스는 자주 사용하는 컬렉터 인스턴스를 손쉽게 생성할 수 있는 정적 팩토리 메서드를 제공한다. Collectors에서 제공하는 메서드의 기능은 크게 세 가지로 구분할 수 있다. 스트림 요소를 하나의 값으로 리듀스하고 요약 요소 그룹화 요소 분할 리듀싱과 요약 counting - 개수를 카운트한다 maxBy, minBy - 최대 혹은 최소를 만족하는 요소를 찾는다 su..
스트림 API가 지원하는 다양한 연산들을 살펴보자. 1. 필터링 filter - Predicate를 통한 필터링 Stream filter(Predicate
스트림이란 무엇인가? 스트림(Stream)은 자바 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 스트림을 이용할 때의 장점은 아래와 같다. 가비지 변수를 만들지 않는다. 선언형으로 코드를 구현할 수 있다. 여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. filter, map, sorted, collect 같은 연산은 고수준 빌딩 블록(high-level building block)으로 이루어져 있으므로 특정 스레딩 모델에 제한되지 않고 자유롭게 어떤 상황에서든 사용할 수 있다. 스트림 API의 특징은 선언형, 조립할 수 있음, 병렬화로 요약 가능..
이 장에서는 람다 표현식을 어떻게 만드는지, 어떻게 사용하는지, 어떻게 코드를 간결하게 만들 수 있는지 설명한다. 또한 자바 8 API에 추가된 중요한 인터페이스와 형식 추론 등의 기능을 확인한다. 람다의 특징 익명 - 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 구형해야 할 코드에 대한 걱정거리가 줄어든다 함수 - 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 하지만 메서드처럼 파라미터 리스트, 바디, 반환 형식, 가능한 예외 리스트를 포함한다. 전달 - 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성 - 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다. 람다의 구성 /* 람다 파라미터 | 화살표 | 람다 바디 */ (Apple a1,..