Search
🙊

이펙티브 자바:: 아이템 45 <스트림은 주의해서 사용해라>

Intro::

이펙티브 자바 정리본입니다.

결론

스트림이 무조건 좋은게 아닙니다.
반복방식이 어울릴 때가 있기도 하고 스트림이 적절한 경우가 있기도 하기 때문에 상황에 맞춰 사용하면 됩니다. 만약 판별하기 어려운 경우 둘다 사용해보고 더 나은 쪽을 결정하면 됩니다.
parallel 메서드로 효과 볼 수 있는 상황은 많지 않습니다.

스트림 API

스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻합니다.
스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념입니다.
스트림은 대표적으로 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기, 혹은 다른 스트림 등등에서 올 수 있습니다.
다음 일들을 수행해야 한다면 스트림과는 맞지 않습니다.
원소들의 시퀀스를 일관되게 변환한다.
원소들의 시퀀스를 필터링한다.
원소들의 시퀀스를 하나의 연산을 사용해 결합한다(더하기, 연결하기, 최솟값 구하기 등)
원소들의 시퀀스를 컬렉션에 모은다(아마도 공통된 속성을 기준으로 묶어가며).
원소들의 시퀀스에서 특정 조건을 만족하는 원소를 찾는다.

예제

public class IterativeAnagrams { public static void main(String[] args) throws IOException { File dictionary = new File(args[0]); int minGroupSize = Integer.parseInt(args[1]); Map<String, Set<String>> groups = new HashMap<>(); try (Scanner s = new Scanner(dictionary)) { while (s.hasNext()) { String word = s.next(); groups.computeIfAbsent(alphabetize(word), (unused) -> new TreeSet<>()).add(word); } } for (Set<String> group : groups.values()) if (group.size() >= minGroupSize) System.out.println(group.size() + ": " + group); } private static String alphabetize(String s) { char[] a = s.toCharArray(); Arrays.sort(a); return new String(a); } }
Java
복사

과한 스트림

public class StreamAnagrams { public static void main(String[] args) throws IOException { Path dictionary = Paths.get(args[0]); int minGroupSize = Integer.parseInt(args[1]); try (Stream<String> words = Files.lines(dictionary)) { words.collect( groupingBy(word -> word.chars().sorted() .collect(StringBuilder::new, (sb, c) -> sb.append((char) c), StringBuilder::append).toString())) .values().stream() .filter(group -> group.size() >= minGroupSize) .map(group -> group.size() + ": " + group) .forEach(System.out::println); } } }
Java
복사
과한 스트림은 오히려 프로그램을 읽기 어렵고 유지보수성을 떨어뜨립니다.

적절한 스트림

public class HybridAnagrams { public static void main(String[] args) throws IOException { Path dictionary = Paths.get(args[0]); int minGroupSize = Integer.parseInt(args[1]); try (Stream<String> words = Files.lines(dictionary)) { words.collect(groupingBy(word -> alphabetize(word))) .values().stream() .filter(group -> group.size() >= minGroupSize) .forEach(g -> System.out.println(g.size() + ": " + g)); } } private static String alphabetize(String s) { char[] a = s.toCharArray(); Arrays.sort(a); return new String(a); } }
Java
복사

References::

이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)