본문 바로가기

IT Book Summary/ModernJavaInAction

(17)
Part 3 스트림과 람다를 이용한 효과적 프로그래밍 - Chapter 8 컬렉션API 개선 이번장에서는 자바8, 9 에서 추가된 새로운 컬렉션 API 기능을 소개한다 8.1 컬렉션 팩토리 Arrays.asList() 팩토리 메서드를 이용하면 코드를 간단하게 줄일 수 있다. List friends = Arrays.asList("Raphael", "Olivia", "Thibaut"); 고정된 리스트를 만들었으므로 요소를 갱신할 수 있지만 새 요소를 추가하거나 삭제는 불가능하다. UnsupportedOperationException 예외발생. 다른 방법으로 갱신할 수있는 배열을 만들순 없을까? - 리스트를 인수로 받는 HashSet 생성자를 사용할 수 있다. Set friends = new HashSet(Arrays.asList("Raphael, "Olivia", "Thibaut")); 또는 스트림..
Chapter7 병렬 데이터 처리와 성능 지금까지 스트림 인터페이스를 이용해 데이터 컬렉션을 선언형으로, 내부 반복으로 스트림 요소의 처리를 제어하는 것을 살펴보았다. 이번장에서는 순차스트림을 병렬 스트림을 바꾸는 것을 설명한다. 7.1 병렬 스트림 : 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림 컬렉션에 parallelStream을 호출하면 병렬스트림이 생성된다. ex) 숫자 n을 인수로 받아 1부터 n까지 모든 숫자의 합계를 반환하는 메서드를 구현해보자. - 숫자로 이루어진 무한스트림-> 인수로 주어진 크기로 스트림을 제한->두 숫자를 더하는 리듀싱작업 public long sequentialSum(long n) { return Stream.iterate(1L, i -> i+1) // 무한 자연수 스트림생성 ..
Chapter6 스트림으로 데이터 수집 중간연산은 스트림 파이프라인을 구성하며 스트림의 요소를 소비하지 않음. 반면 최종연산은 스트림의 요소를 소비해서 최종결과를 도출. 이전 챕터의 예제에서는 toList 로 스트림 요소를 리스트로만 변환했지만 이번 챕터에서는 reduce가 그랬던것처럼 collect 역시 다양한 요고 누적방식을 인수로 받아 스트림을 최종결과로 도출하는 리듀싱 연산을 수행할 수 있음을 설명한다. 다양한 요소 누적 방식은 Collector 인터페이스에 정의되어 있다. Collection, Collector, collect를 헷갈리지 않게 주의하자. collect와 컬렉터로 구현할 수 있는 질의 예제 통화별로 트랜젝션을 그룹화한 다음에 해당 통화로 일어난 모든 트렌잭션 합계를 계산 (Map 반환) 트렌잭션을 비싼 트랜잭션과 저렴한..
Chapter5 스트림 활용 데이터 컬렉션 외부반복 코드를 filter와 collect 연산을 이용해 내부 반복으로 처리 List vegetarianDishes = new ArrayList(); for(Dish d: menu) { if(d.isVegetarian()){ vegetarianDishes.add(d); } } //filter 메서드에 필터링 연산을 인수로 넘겨줌 import static java.util.stream.Collectors.toList; List vegerarianDishes = menu.stream() .filter(Dish::isVegetarian) .collect(toList()); 이 장에서는 스트림 API 가 지원하는 다양한 연산을 알아볼것이다. 5.1 필터링 프레디케이트로 필터링 filter 메서드..
Part 2 함수형 데이터 처리 - Chapter 4 스트림 소개 대부분의 자바 애플리케이션에서는 컬렉션을 많이 사용한다. 비지니스 로직에 카테고리로 그룹화 한다던지, 가장 비싼 것을 찾는등의 연산이 포함된다. 데이터베이스에서는 선언형으로 SQL 질의 언어에서 우리가 기대하는 것이 무엇인지 직접 표현 가능하다. 컬렉션도 이와 비슷한 기능을 만들 수 있지 않을까? 많은 요소를 포함하는 커다란 컬렉션은 어떻게 처리해야 할까? 스트림이란 무엇인가? 자바 8에 추가된 기능으로, 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 멀티스레드를 구현하지 않아도 데이터를 병렬로 처리 가능하다. 기존의 자바코드와 비교해보자. List lowCaloricDishes = new ArrayList(); for(Dish dish: menu) { if(dish.getCalories() < 40..
Chapter3 람다 표현식_02 형식 검사, 형식 추론, 제약 람다로 함수형 인터페이스의 인스턴스를 만들 수 있다고했다. 람다 표현식 자체에는 람다가 어떤 함수현 인터페이스를 구현하는지 정보가 없다. 따라서 제대로 람다표현식을 이해하려면 람다의 실제 형식을 파악해야 한다. 형식검사 람다가 사용되는 콘텍스트를 이용해 형식을 추론 가능. 어떤 콘텍스트에서 기대되는 람다 표현식의 형식을 대상 형식 target type 이라고 한다. List heavierThan150g = filter(inventory, (Apple apple) -> apple.getWeight() > 150); filter 메서드의 선언을 확인한다. filter 메서드는 두번째 파라미터로 Pradicate 형식(대상형식)을 기대한다. Pradicate은 test 라는 한 ..
Chapter3 람다 표현식 _ 01 이 챕더에서는 람다 표현식을 어떻게 만드는지 어떻게 사용하는지, 어떻게 코드를 간결하게 만들 수 있는지 설명할 것이다. 또한 자바 8에 추가된 중요한 인터페이스와 형식추론 등의 기능, 위력을 발휘하는 메서드 참조를 설명한다. 내용 자체도 중요하지만 람다표현식은 광범위하게 사용되므로 이 장의 내용을 완벽히 이해해야 한다. 람다란 무엇인가? 람다 표현식은 메서드로 전달할 수 있는 익명함수를 단순화한 것. - 이름은 없지만 파라미터 리스트, 바디, 반환형식, 발생가능한 예외 리스트는 가질 수 있다. 특징 익명 - 보통의 메서드와 달리 이름이 없음 함수 - 특정 클래스에 종속되지 않음 전달 - 람다표현식을 메서드 인수로 전달하거나 변수로 저장 간결성 - 코드 구현의 간결함. 자바8 이전의 할 수 없었던 일을 하..
Chapter 2 동작 파라미터화 코드 전달하기 사용자의 요구사항은 항상 변한다. 따라서 새로 추가하는 기능은 쉽게 구현할 수 있고 유지보수가 쉬워야한다. 동작 파라미터화 behavior parameterization : 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록. 코드블록의 실행은 나중으로 미뤄진다. -> 나중에 실행될 메서드의 인수로 코드블록을 전달할 수 있다. ->코드블록에 따라 메서드의 동작이 파라미터화 된다. 리스트의 모든 요소에 대해서 ''어떤 동작을 수행할 수 있음. 리스트 관련 작업을 끝낸 다음에 '어떤 다른 동작'을 수행할 수 있음. 에러가 발생하면 '정해진 어떤 다른 동작'을 수행할 수 있음. 첫번째 시도 : 녹색사과 필터링 enum Color { RED, GREEN } public static List filterGree..