개발/Java

[Java] 스트림 (Stream)

hojak99 2017. 10. 18. 17:28

우선 스트림에 대해서 알아야 할 것 같다.



스트림 : 

자바8 에 추가된 API 로 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다.

여기서 선언형은 데이터를 처리하는 임시 구현 코드 대신 질의로 표현할 수 있는 것이다.



Java In Action 에서는 이 스트림 API를 이용하면 멀티 스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다고 한다. 투명하게란 말은 부작용이 없다는 뜻인 것 같다.



코드로 살펴보자.


public class Test {

	public static void main(String[] args) {

		List<Integer> numberList = Arrays.asList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9);

		List<Integer> resultList = new ArrayList<Integer>();

		for (Integer temp : numberList) {
			if (temp < 7) {
				resultList.add(temp);
			}
		}

		System.out.println("resultList 정렬 전 : "+resultList.toString());

		Collections.sort(resultList, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return Integer.compare(o1, o2);
			}
		});

		System.out.println("resultList 정렬 후 : "+resultList.toString());	
		
	}
}


// resultList 정렬 전 : [5, 3, 2, 1, 4, 6]
// resultList 정렬 후 : [1, 2, 3, 4, 5, 6]

 다음과 같이 코드를 작성하는 건 Java 7 당시의 코드라고 한다. 한 눈에 보아도 코드가 길고, 길고, 길다. 


그러면 Java 8 에 있다는 스트림 API 를 사용하면 어떻게 될까? 나도 궁그미


public static void main(String[] args) {
		List<Integer> numberList = Arrays.asList(5, 3, 2, 1, 4, 8, 7, 6, 10, 9);

		List<Integer> resultList = numberList.stream()
				.filter(d -> d < 7)
				.sorted(Comparator.comparing(Integer::intValue))
				.collect(Collectors.toList());
		
		System.out.println("resultList 정렬 후 : "+resultList.toString());
	}


// resultList 정렬 후 : [1, 2, 3, 4, 5, 6]

정달 대-단한 코드다. 무척이나 깔끔해진 코드이다.


여기서 .stream() 을 .parallelStream() 으로 바꾸면 멀티코어 아키텍처에서 병렬로 실행할 수 있다고 한다.


parallel 메소드에서 병렬로 작업을 수행하는 스레드는 내부적으로 ForkJoinPool을 사용하는데, 여기서 ForkJoinPool은 프로세서 수, 즉 Runtime.getRuntime().availableProcessors()  가 반환하는 값에 상응하는 스레드를 갖는다고 한다.




반응형