- 순수 함수 : 오직 입력만이 결과에 영향을 주는 함수를 말한다.
Map<String, Long> freq = new HashMap<>();
try (Stream<String> words = new Scanner(file).tokens()) {
words.forEach(word -> {
freq.merge(word.toLowerCase(), 1L, Long::sum);
});
}
- 조금 더 길고, 가독성이 좋지 않고, 유지보수에도 좋지 않다.
Map<String, Long> freq;
try (Stream<String> words = new Scanner(file).tokens()) {
freq = words
.collect(groupingBy(String::toLowerCase, counting()));
}
- 짧고 명확해졌다.
- 대놓고 반복적이라 병렬화할 수도 없다.
// Map<String, Long> freq; ...
List<String> topTen = freq.keySet().stream()
.sorted(comparing(freq::get).reversed())
.limit(10)
.collect(toList());
private static final Map<String, Operation> stringToEnum =
Stream.of(values()).collect(
toMap(Object::toString, e -> e)
);
Map<Artist, Album> topHits = albums.collect(
toMap(Album::artist, a -> a, maxBy(comparing(Album::sales)))
);
toMap(keyMapper, valueMapper, (oldVal, newVal) -> newVal)
// Stream 학습 내용 중 예제
public Map<String, Integer> quiz1() throws IOException {
List<String[]> csvLines = readCsvLines();
return csvLines.stream()
.map(line -> line[1].replaceAll("\\s", ""))
.flatMap(hobbies -> Arrays.stream(hobbies.split(":")))
.collect(Collectors.toMap(hobby -> hobby, hobby -> 1, (oldValue, newValue) -> newValue += oldValue));
}
// 결과 Map<String, List<String>>, Key가 alphabetize된 결과
Map<String, List<String>> collect1 =
words.collect(groupingBy(word -> alphabetize(word)))
- item45의 아나그램 프로그램에서 사용된 수집기
// 결과 Map<String, List<String>>, Key가 alphabetize된 결과
Map<String, Set<String>> collect2 =
words.collect(groupingBy(HybridAnagrams::alphabetize, toSet()));
Map<String, Long> freq = collect3
.collect(groupingBy(HybridAnagrams::alphabetize, counting()));
TreeMap<String, Long> freq = words
.collect(groupingBy(HybridAnagrams::alphabetize, TreeMap::new, counting()));
- 다운스트림 수집기까지 입력받는 버전도 다중정의되어 있다.
Map<Artist, Album> topHits = albums.collect(
toMap(Album::artist, a -> a, maxBy(comparing(Album::sales)))
);
public class Joining {
public static void main(String[] args) {
List<String> stringList = List.of("apple", "banana", "pear");
// 인수가 없는 경우
String collect1 = stringList.stream().collect(joining());
System.out.println(collect1); // applebananapear
// 인수가 1개인 경우
String collect2 = stringList.stream().collect(joining(","));
System.out.println(collect2); // apple,banana,pear
// 인수가 3개인 경우
String collect3 = stringList.stream().collect(joining(",","[","]"));
System.out.println(collect3); // [apple,banana,pear]
}
}
Reference: