2014-04-24 2 views
5

간단한 반복을 위해 새 Stream API를 사용하면 어떤 이점이 있습니까? 스트림 API없이간단한 반복을 위해 Stream API를 사용해야하나요?

:

for (Map.Entry<String, String> entry : map.entrySet()) { 
     doSomething(entry); 
    } 

스트림 API를 사용하여 :

map.entrySet().stream().forEach((entry) -> { 
     doSomething(entry); 
    }); 

길이와 코드의 가독성은 거의 동일하다. 중요한 차이 (예 : 실적)가 있습니까? (당신은 단지 대형 컬렉션 혜택을 볼 수 있지만)

+2

. 따라서 유스 케이스 자체만으로는 좋은 예가 아닙니다. 그러나'map.forEach' 메소드 자체를 사용하려고한다면, 람다를 사용할 때 어떤 점이 있지만 그때 다시는 스트림을 사용하지 않을 것입니다. – skiwi

+3

동일 항목은 entrySet에 적용됩니다. 스트림이 필요없이'map.entrySet(). forEach (...) '라고 말할 수있다. 단일 메소드 호출의 경우'map.entrySet(). forEach (context :: doSomething); '형식이 람다 표현식보다 바람직합니다. * 실제로는 * 더 짧고 읽기 쉽기 때문입니다. 그래서 만약 당신이 * 기존의 * 메소드'doSomething'을 하나의 엔트리 인스턴스 나 key와 value를 매치하는 두 개의 매개 변수를 가지고 있다면, forEach (...)를 사용하는 것이 중요합니다. – Holger

+2

또한이 방법으로 작성하더라도 두 번째 예제에서는 대괄호가 필요하지 않습니다. 나는 그것이 더 읽기 쉽다는 것을 생각한다 ... – Veluria

답변

5

스트림 API는 달성 병렬 처리가 훨씬 쉬워집니다.

을 : 당신이 당신의 첫 번째 예제에 병렬 처리를 구현했다 경우 Java Trail on parallelism으로 당

(두 번째 예에 .parallelStream()를 추가 반대) 다음 코드의 양에 상당한 차이가있을 것입니다 모음을 사용하는 응용 프로그램에 병렬 구현

한 어려움 모음 여러 스레드 스레드 간섭 또는 메모리 일관성 오류를 도입하지 않고 집합을 조작 할 수 있음을 의미하는 스레드 안전하지 않은 점이다. 컬렉션 프레임 워크는 동기화 래퍼를 제공합니다.이 래퍼는 임의의 컬렉션에 자동으로 동기화를 추가하여 스레드로부터 안전하게 만듭니다. 그러나 동기화는 스레드 경합을 발생시킵니다. 스레드가 병렬로 실행되는 것을 방지하기 때문에 은 스레드 경합을 피하기를 원합니다. 집계 연산과 병렬 스트림을 사용하면 작업을 수행하는 동안 컬렉션을 수정하지 않으면 은 스레드 안전하지 않은 컬렉션으로 병렬 처리를 구현할 수 있습니다. 충분한 데이터와 프로세서 코어가있는 경우가있을 수 있지만 병렬 처리가 자동 직렬 작업을 수행하는 것보다 더 빠른 아니라고 을합니다. 집계 연산을 사용하면 병렬 처리를보다 쉽게 ​​구현할 수 있지만 응용 프로그램이 병렬 처리에 적합한 지 판단하는 것은 사용자의 책임입니다.

3

당신은 스트림에 대해 물었지만, skiwi의 댓글이 언급 한 바와 같이 반복이 간단하고 병렬 또는 추가 로직을 필요로하지 않는 경우,지도에 forEach 기본 방법에 람다를 전달하는 것은 가능성이 법안을 채 웁니다했다. doSomething가 리팩토링 될 수 있음을 가정하면 대신 Map.Entry의 별도의 키와 값 인수를 취할, 이것은 한 라이너로 감소 될 수있다

이 * 더 읽기 * 코드를 짧게 만들 수 있다면 스트림이 사용되어야한다
map.forEach(MyClass::doSomething); // if doSomething is a static method 

    map.forEach(this::doSomething);  // if doSomething is an instance method 
관련 문제