최근에 회사에서 새로운 프로젝트를 진행하면서, 사실 저는 별로 Java를 선호하는 사람은 아니었습니다만 Java 8을 써보게 되면서 완전히 Java의 세계로 빠져들게 되었습니다.
물론 아직도 쓸데없이 복잡한 syntax들이 있긴 하지만, 그래도 정말로 최신 language에 뒤지지 않는 좋은 기능들을 많이 탑재하고 있었고, 가히 Java 역사상 가장 큰 major update라고 할만 하다는 생각이 들었습니다 🙂
어쨌든 많은 update들 중 여기서 살펴볼 항목은 Stream이라는 새로운 형태의 자료구조입니다. 만약 분산처리에 익숙하신 분들이라면 Spark를 통해서 이미 익숙한 개념일텐데요, 이 개념을 통해서 아주 획기적인 변화를 가져올 수 있습니다.
여기서 사용할 예제는 0에서 9까지의 정수 리스트가 주어졌을 때, 각 원소에 10씩을 더해서 새로운 리스트를 만드는 것입니다. 일단 0에서 9까지의 정수 리스트를 클래식한 방법으로 만들어 보겠습니다.
List integers = new ArrayList<>(); for (int i=0; i<10; i++) { integers.add(i); }
이렇게 되면 integers
에는 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
의 숫자가 저장되게 됩니다. 기존 문법으로는 새로운 리스트를 만드려면,
- 새로운 `ArrayList`를 만든다.
- `for`문을 돌면서 각 원소의 값을 10씩 더한 후 `add`한다.
이렇게 했어야 했습니다. 하지만 Stream을 이용하면 얼마나 간단하고 직관적이어지는지 보시죠.
List newIntegers = integers.stream().map(i -> i + 10).collect(Collectors.toList());
일단은 list인 integers
를 stream()
함수를 통해서 Stream
형태로 바꾸고, 그 다음에 map
함수를 통해서 list의 각 원소 i에 대해서 10씩 더해서 마지막에 collect
를 하라는 명령입니다. 이렇게 하면 결과값은 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
로 우리가 원하는 값이 나오게 됩니다.
어떻게 보면 Stream을 이용한 가장 간단한 예제를 살펴봤는데요, 이것으로 얼마나 많은 일들을 할 수 있는지 기대해도 좋습니다 🙂