8.1 컬렉션 팩토리 Arrays.asList() 팩토리 메서드를 이용하면 코드가 간단하게 생성 가능하다. 요소를 추가하거나 삭제하면 AbstractList 클래스에서 UnsupportedOperationException이 발생한다. UnsupportedOperationException이 발생하는 이유는 뭘까?? asList에서 사용하는 ArrayList는 java.util.ArrayList가 아니라 Arrays 클래스 내부의 정적인 클래스인 ArrayList를 사용하고 있다. Arrays클래스의 ArrayList 멤버 변수를 보면 Element가 final 키워드와 함께 초기화 되는것을 볼 수 있다. java.util.ArrayList와 동일한 추상 클래스인 AbstractList를 상속하고 있다. 집..
책/모던 자바 인 액션
자바 7(포크/조인 프레임워크)이 등장하기 전에는 데이터를 서브파트로 분할하여 각각 스레드로 할당해야 된다. 의도치 않은 레이스 컨디션이 발생하지 않도록 적적한 동기화를 추가하여 마지막으로 부분 결과를 합쳐야 한다. 7.1 병렬 스트림 병렬 스트림이란 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림이다. (parallelStream) public static long parallelSum(long n) { return Stream.iterate(1L, i -> i + 1) .limit(n) .parallel() //스트림을 병렬 스트림으로 변환 .reduce(0L,Long::sum); } 이전 코드와 다른점은 parallel 메서드를 통해서 스트림이 여러 청크로 분활되어 있다..
컬렉션(Collection), 컬렉터(Collector), collect를 주의하며 학습하자 6.1 컬렉터란 무엇인가? 명령형 프로그래밍과 함수형 프로그래밍의 차이 명령형 프로그래밍 private static void groupImperatively() { Map transactionsByCurrencies = new HashMap(); for (Transaction transaction : transactions) { Currency currency = transaction.getCurrency(); List transactionsForCurrency = transactionsByCurrencies.get(currency); if (transactionsForCurrency == null) { tran..
스트림 API는 내부적으로 다양한 최적화가 이루어져 내부 반복 뿐 아니라 코드를 병렬로 실행할지 여부도 결정할 수 있다. 순차적인 반복을 단일 스레드로 구현하는 외부 반복으로는 스트림 API만큼의 최적화를 달성할 수 없다. 필터링 Predicate를 이용해서 스트림의 요소를 선택하는 방법 Stream filter(Predicate
컬렌션 관련 연산을 SQL처럼 선언형으로 연산을 표현할 수 없을까? 이 장의 내용 스트림이란 무엇인가? 컬렉션과 스트림 내부반복과 외부 반복 중간연산과 최종 연산 4.1 스트림이란 무엇인가? 스트림(Stream)은 자바 8 API에서 새로 추가된 기능이다. 스트림을 이용하면 선언형(데이터를 처리하는 임시 구현 코드 대신 질의로 표현)으로 컬렉션 데이터를 처리할 수 있다. 스트림을 통해서 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 기존 코드(자바7) List lowCaloricDishes = new ArrayList(); for(Dish dish : menu) { if(dish.getCalories() < 400) { lowCaloricDishes.add(dish); } ..