728x90 Modern java in action6 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 의존 객체주입 클래스의 유연성, 재사용성, 테스트 용이성을 개선해준다. public class Coffee{ private final Beans coffeeBeans; public Coffee(Beans coffeeBeans){//요기 this.coffeeBeans = Object.requireNonNull(coffeeBeans); } ... } 사용하는 자원에 따라 동작이 달라지는 클래스의 경우 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 대신 클래스가 여러 자원 인스턴스를 지원해야 하며 이를 위해 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다. 이 패턴의 변형으로 생성자에 자원 팩터리를 넘겨주는 방식이 있다. (팩터리 메서드 패턴) Coffee create(Supplier 2021. 8. 22. [modern java in action] stream(5) 5-1 컬렉터린 무엇인가? → Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정한다. / collect로 결과를 수집하는 과정을 간단하고 유연한 방식으로 정의할 수 있다는 점이 장점 보통 함수를 요소로 변환할 때는 컬렉터를 적용하며 최종결과를 저장하는 자료구조에 값을 누적한다. 미리 정의된 컬렉터 스트림 요소를 하나의 값으로 리듀스하고 요약 요소 그룹화 요소 분할 5-2 리듀싱과 요약 → 컬렉터로 스트림의 모든 항목을 하나의 결과로 합칠 수 있다. 트리를 구성하는 다수준 맵, 메누의 말로리 합계를 가리키는 단순한 정수 등 다양한 형식으로 결과가 도출될 수 있다. long howManyDishes = menu.stream().collect(Collectors.counting().. 2021. 6. 24. [modern java in action] stream(4) 4-5 리듀싱 스트림의 모든 요소를 반복적으로 처리해서 값을 도출하는 연산을 리듀싱 연산이라고 한다. 함수형 프로그래밍 언어 용어로는 이 과정이 마치 종이를 작은 조각이 될 때까지 반복해서 접는 것과 비슷하다는 의미로 폴드라고 부른다. 1)요소의 합 (reduce) int sum = numbers.stream().reduce(0, (a,b) -> a + b); //누적값 계산 reduce( 초기값 , 두 요소를 조합해서 새로운 값을 만드는 BinaryOperator) 2)초기값 없음 Optional sum = numbers.stream().reduce((a , b) -> (a + b);) 이런경우 Optional객체를 반환한다. 스트림에 아무 요소도 없는 경우 초기값이 없으므로 reduce는 합계를 반환.. 2021. 6. 24. [modern java in action] stream(3) 4-3 매핑 → 특정 객체에서 특정 데이터를 선택하는 작업 1) 스트림의 각 요소에 함수 적용하기 map : 인수로 제공된 함수는 각 요소에 적용되며 함스를 적용한 결과가 새로운 요소로 매핑된다. → 새로운 버전을 만드는 개념 (변환에 가까운 매핑) List dishNames = menu.stream() .map(Dish::getName) .collect(toList()); 2) 스트림 평면화 map과 Arrays.stream 활용 String[] arrayOfWords = {"Goodbye", "World"}; Stream streamOfWords = Arrays.stream(arrayOfWords); words.stream() .map(word -> word.split("")) //각 단어를 개별 문.. 2021. 6. 24. 이전 1 2 다음 728x90