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::
이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)