본문 바로가기

Reading/Effective Java

(65)
[Effective-Java] Item 45. 스트림은 주의해서 사용하라 스트림 API 순차적이든 병렬적이든 다량의 데이터 처리 작업을 돕고자 자바 8에 추가된 스트림 API가 제공하는 추상 개념 중 핵심은 두 가지다. 스트림(steram): 데이터 원소의 유한 혹은 무한 시퀀스(sequence) 스트림 파이프라인(stream pipeline): 이 원소들로 수행하는 연산 단계를 표현하는 개념 스트림의 원소들은 어디로부터든 올 수 있다. ex) 컬렉션, 배열, 파일, 정규표현식 패턴 매처(matcher), 난수 생성기 등 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값은 IntStream, LongStream, DoubleStream이 있다. 스트림 파이프라인은 소스 스트림에서 시작해 종단 연산(terminal operation)으로 끝나며, 그 사..
[Effective-Java] Item 44. 표준 함수형 인터페이스를 사용하라 LinkedHashMap으로 알아보기 자바가 람다를 지원하며 상위 클래스의 기본 메소드를 재정의해 원하는 동작을 구현하는 템플릿 메소드 패턴의 사용이 줄었다. 이를 대체하는 방법은 같은 효과의 함수 객체를 받는 정적 팩토리나 생성자를 제공하는 것이고, 함수 객체를 매개변수로 받는 생성자와 메소드를 더 많이 만들어야한다. 이때 함수형 매개변수 타입을 올바르게 선택해야한다. LinkedHashMap의 protected 메소드인 removeEldestEntry를 재정의하면 캐시로 사용할 수 있다. 어떻게 가능할까? LinkedHashMap은 HashMap을 상속한다. HashMap에서 put 메소드는 afterNodeInsertion 메소드를 호출한다. HashMap의 afterNodeInsertion 메소드..
[Effective-Java] Item 43. 람다보다는 메소드 참조를 사용하라 메소드 참조(method reference) : 람다식이 단 하나의 메소드만을 호출하는 경우 필요없는 매개변수를 제거하고 사용할 수 있게 하는 것 람다로도 익명클래스보다 간결한데 한 층 더 간격하게 만드는 방법이다. 아래 코드를 보자 Map frequencyTable = new TreeMap(); String[] argg = {"k","t","a","e","k","t"}; for (String s : argg) frequencyTable.merge(s, 1, (count, incr) -> count + incr); // 람다 for (String s : argg) frequencyTable.merge(s, 1, Integer::sum); // 메서드 참조 매개변수 count와 incr은 두 인수의 합을 ..
[Effective-Java] Item 42. 익명 클래스보다는 람다를 사용하라 이전 자바에서 함수 타입 표현은 추상 메소드 하나인 interface, 혹은 추상클래스에서 jdk1.1(1997)이후 익명클래스를 주로 사용하게 됐다. 전략 패턴처럼 함수 객체를 사용하는 과거 객체 지향 디자인 패턴에는 익명 클래스면 충분했다. 익명 클래스의 인스턴스를 함수 객체로 사용하는 방법 List words = Arrays.asList("d","c","b","a"); Collections.sort(words, new Comparator() { @Override public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }); Comparator 인터페이스가 정렬을 담당하는 추상 전략을 뜻..