티스토리 뷰

donaricano-btn
반응형

무작위로 0에서 99까지의 숫자들 중 10개를 뽑아서 오름차순으로 정렬한 뒤 출력하는 함수를 작성해 봅시다. 다음과 같은 코드를 만들 수 있겠죠.

 

public void printRandomNumbers() {
    Set<Integer> cache = new HashSet<>();
    List<Integer> result = new ArrayList<>();
    while(result.size() < 10) {
        int number = (int) (Math.random() * 100);
        if (cache.contains(number)) {
            continue;
        }
        cache.add(number);
        result.add(number);
    }
    Collections.sort(result);

    for (int number : result) {
        System.out.println(number);
    }
}

 

하지만 자바8 부터는 Stream 을 사용해서 다음과 같이 간단하게 표현 가능합니다

 

public void printRandomNumbers() {
    Stream.generate(() -> (int) (Math.random() * 100))
            .distinct()
            .limit(10)
            .sorted()
            .forEach(System.out::println);
}

 

먼저 generate 메소드가 눈에 띕니다. 이 메소드는 argument로 함수를 받습니다. 함수에서 리턴되는 객체가 스트림으로 생성되는 것이죠. 함수는 무한히 호출되기 때문에 무한한 길이의 스트림이 생성됩니다. 그렇기 때문에 limit 메서드와 항상 함께 사용해야 합니다. limit 메소드는 스트림에서 일정 개수만 가져와서 새로운 스트림으로 리턴해 주는 역할을 합니다.

 

distinct 메소드는 중복되는 아이템들을 모두 제거해주고 새로운 스트림을 반환합니다. 번거로운 중복 체크 코드를 사용하지 않아도 되는 것이죠. 그리고 마지막으로 sorted 메소드는 정렬된 스트림을 반환하게 됩니다.

반응형
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함