-
0. 들어가며스트림에서 '부작용 없는 함수'를 사용하라는 말은 무슨 뜻 일까요?
1. 순수함수다른곳에 영향을 끼치지 않는 함수를 함수형 프로그래밍에서는 '순수 함수'라고 하는데요. 이를 코드로 한번 살펴볼텐데요. class Something {
private static int num = 1;
public static void main(String[] args) {
IntStream.range(0,10).forEach(HelloWorld::plusNumber);
System.out.println(num); // 46
}
private static void plusNumber(int i) {
num += i;
}
} plusNumber 라는 함수는 주어진 i 를 Something 이라는 클래스의 num 에 더하는 역할을 합니다. 그래서 보통 순수함수는 외부 요소를 참조하지 않거나, 참조하더라도 변경시키지 않는 경우가 많습니다. 2. 짧고 명확하게책에서는 스트림을 잘 사용하면 표현력, 속도, (상황에 따라)병렬성을 얻을 수 있다고 합니다. import java.util.Map;
import java.util.stream.Stream;
Map<String, Long> freq = new HashMap<>();
try (Stream<String> words = new Scanner(file).tokens()) {
words.forEach(word -> {
freq.merge(word.toLowerCase(), 1L, Long::sum)
}
} 위 로직은 두 가지 문제가 있습니다.
그래서 책에서는 Stream 에서 제공하는 API 들을 통해 아래와 같이 간결한 코드로 만들었습니다. import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import java.util.Map;
import java.util.stream.Stream;
Map<String, Long> freq;
try (Stream<String> words = Stream.of("abcdefg", "hijklmn", "opqrstu", "vwxyz", "opqrstu")) {
freq = words.collect(groupingBy(String::toLowerCase, counting()));
} 하지만 저는 스트림에 익숙하지 않아서, 이 코드를 보고 오히려 직관적으로 이해가 되진 않았는데요. 3. 스트림이 제공하는 API 들
위처럼 다양하게 활용 가능한데요.
이 외에도 groupingBy 라는 메서드로 Map 으로 변환할 수도 있습니다만 이는 단순 변환이 아닌 '축소'에 해당합니다. 이 대표적인 예가 2번에서 살펴봤던 변경 후 예제 코드인데요. import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import java.util.Map;
import java.util.stream.Stream;
Map<String, Long> freq;
try (Stream<String> words = Stream.of("abcdefg", "hijklmn", "opqrstu", "vwxyz", "opqrstu")) {
freq = words.collect(groupingBy(String::toLowerCase, counting()));
} 이를 보면 문자열 스트림은 총 5개의 문자열을 가지고 있습니다. 4. 결론이 처럼 Stream 을 이용하면 간결하고 명확한 코드를 빠르게 생산해낼 수 있습니다. 하지만 팀원들이 모두 익숙한 상황이 아닌 상태라면 협업 관점에서는 좋은 영향이 있을지는 조금 더 고민해봐야할 것 같습니다. |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments
-
@jinan159 님께서 말씀해주신 불변이 아닌 변수는 예상치 못한 상황에 예상치 못한 값으로 변경될 가능성이 있고, 함수형 프로그램은 대입문이 없어서 기본적으로 한번 값이 변수에 할당되고 나면 이후에 값이 변경되지 않는 특징을 가지고 있는것으로 알고 있습니다. 부수효과(Side Effect)를 발생시키지 않기 때문에 표현 식을 언제 어느 때 실행 하더라도 문제가 발생하지 않으며 이는 프로그래머가 신경 쓸 부분이 줄어들게 만들어줍니다. 이러한 특성을 @jinan159 님이 정리해주신 위의 감사합니다.
|
Beta Was this translation helpful? Give feedback.
-
스트림,, 이제는 스트림 없이 어떻게 개발했는지는 상상 못 할 정도로,, 저도 적극 사용하고 있습니다. |
Beta Was this translation helpful? Give feedback.
-
이전에 #106 디스커션 댓글에서 언급한 순수함수가 여기서 나오는 군요
@coalong 님 께서 작성하신 #121 에서 언급하신 |
Beta Was this translation helpful? Give feedback.
이전에 #106 디스커션 댓글에서 언급한 순수함수가 여기서 나오는 군요
@coalong 님 께서 작성하신 #121 에서 언급하신
이처럼 자바로 동시성 프로그램을 작성하기 쉬워지고는 있지만, 안정성(safety)과 응답 가능(liveness) 상태를 유지하기 위해 코드를 올바르게 작성하는 것은 어려운 작업이다.
과 관련된 것 같으니 같이 보면 좋을 것 같아요