Java8 함수식 프로그래밍 (2): 스파크 RDD 산자의 Stream 흐름 조작

5133 단어

1 스트림 흐름


집합을 교체할 때 그iterator 방법을 호출하여iterator 대상을 되돌려주면 이iterator 대상을 통해 집합 중의 원소를 두루 훑어볼 수 있다. 이것은 외부 교체(for순환 자체가 바로 그 문법사탕을 봉함)라고 하는데 그 설명도는 다음과 같다.
그 밖에 내부 교체 방법도 있다. 이것이 바로 여기에 설명하고자 하는 집합의stream() 방법이 되돌아오는 Stream 대상의 일련의 작업이다. 예를 들어 하나의 숫자 목록의 짝수 요소 개수를 통계하고stream 대상의 조작을 사용할 때 다음과 같다.
List list = new ArrayList(){{
    add(1);
    add(2);
    add(3);
}};

long count = list.stream().filter(num -> num % 2 == 0).count();
System.out.println(count);  // 1

도식은 다음과 같습니다.
위에서 제공한 예, 예를 들어 Filter의 매개 변수는 lambda 표현식이기 때문에Stream은 함수식 프로그래밍 방식으로 집합 클래스에서 복잡한 조작을 하는 도구이다.

2 Stream 스트리밍 및 Spark RDD 계산


사실 스파크 경험이 있는 사람이 스트림 흐름을 사용하기 시작하면 마치 모든 것이 익숙한 것처럼 느껴진다.
스파크 RDD 산자가 소개한 문장 참조: 스파크 RDD 산자 실전https://blog.51cto.com/xpleaf/2108481
다음은 조작 대상(명사)과 대상 조작(동사) 두 각도에서 간단하게 비교해 보겠습니다.

2.1 운영 객체


Spark RDD 산자의 조작 대상은 RDD이다. 중국어로 탄성 분포식 데이터 집합이라는 뜻이다. 사용자에게 이것은 집합과 같은 대상이고 그 안에 저장된 것은 데이터이다. 단지 밑에 저장된 데이터는 각 노드의 각partition에 분포할 수 있지만 어쨌든 그 본질은 데이터 집합이다.
Stream 흐름 조작의 조작 대상은 집합이고 집합의 본질도 데이터 집합이다. 단지 RDD에 비해 이것은 단기적이다.

2.2 개체 작업


Spark RDD 산자는 두 가지 유형이 있는데 그것이 바로 Transformation 산자와 Action 산자이다. 전자는 지연 계산이다. 이것은 데이터의 논리적 조작만 기억하고 실제로 집행하지 않으며 후자는Transformation 산자를 진정으로 촉발하는 계산이다.
Stream 흐름 조작도 두 가지 유형이 있는데 그것이 바로 타성 값을 구하는 것과 조기 값을 구하는 것이다. 전자도 타성 값을 구하는 논리적인 조작을 기록했을 뿐이고 후자야말로 진정한 촉발 조작이다.
이를 통해 알 수 있듯이 둘은 매우 비슷하다. 하나는 분포식 데이터에 대한 각종 조작이고 하나는 단기 데이터에 대한 각종 조작이다. 계산을 지연 계산과 트리거 계산 두 가지로 나눈다. 장점은 뚜렷하다. 데이터 집합에 대해 여러 차례 논리적인 조작을 할 때 한 번만 교체하면 완성할 수 있다. 이렇게 하면 진정으로 트리거 계산을 할 때 한 번의 교체가 가져오는 성능 향상이 현저하다.예를 들어 필터와 계산 두 가지 조작(앞에서 짝수를 계산한 조작)은 한 번의 교체에서 완성할 수 있다.
물론 유형이 비슷할 뿐만 아니라 그 자체가 제공한 조작의 명칭도 비슷하고 어떤 것들은 정말 통용된다.

3 일반적인 스트림 작업


모든 조작은 통속적이고 알기 쉬운 예로 설명한다.

3.1 조기 가치 추구 작업


3.1.1 collect(toList())


스트림 흐름의 요소를 모아 리스트, 셋 또는 맵 등을 형성하는 역할을 한다.
List list = Stream.of(1, 2, 3).collect(Collectors.toList());

System.out.println(list);   // [1, 2, 3]

1.Stream.of () 방법은 Stream 흐름을 쉽게 생성하는 데 사용됩니다.
2. Collectors에는 toSet(), toMap() 등의 방법이 있는데 상세한 것은 API를 참조한다.

3.1.2 forEach(Consumer)


Consumer 함수 인터페이스인 컬렉션의 각 요소를 조작합니다.
Consumer printNum = System.out::print;
Stream.of(1, 2, 3).forEach(printNum);   // 123

System.out::print는 System을 사용함을 나타냅니다.out 클래스의 print 방법은 lambda 표현식:element->System.out.print(element);
위의 예도 한 걸음에 도달할 수 있다.
Stream.of(1, 2, 3).forEach(System.out::print);  // 123

3.1.3 max와min


그 매개 변수는 Comparator 인데 Optional 대상을 되돌려준다. Optional은 그 결과가 있을 수도 있고 없을 수도 있다(예를 들어 빈 값의Stream 흐름 조작 시).
//  
Optional maxOptional = Stream.of(1, 2, 3).max(Comparator.comparing(num -> num));
System.out.println(maxOptional.get());  // 3

//  
Optional minOptional = Stream.of("a", "ab", "abc").min(Comparator.comparing(String::length));
System.out.println(minOptional.get());  // a

또한 이 작업은 다음 사항을 확인할 수 있습니다.
Stream.of(1, 2, 3).max(Comparator.comparing(num -> {
    System.out.println(num);
    return num;
}));

출력:
1
2
2
3

3.2 불활성 값 구하기 조작


3.2.1 map


매개변수는 Function<T,R>로, 스트림 흐름의 값을 다른 흐름으로 변환하는 데 사용됩니다.
//  
Stream.of("a", "b", "hello")
    .map(String::toUpperCase)
    .forEach(element -> System.out.print(element + " "));  // A B HELLO 

3.2.2 filter


매개변수는 Predicate<T>로 Stream 흐름의 요소를 필터링합니다.
//  
List list = Stream.of(1, 2, 3).filter(num -> num % 2 == 0).collect(Collectors.toList());

System.out.println(list);   // [2]

3.2.3 flatMap


그 매개 변수는 Function<T,R>이지만 이때RStream로 한정되어 Stream 흐름의 값을 더 많은 흐름으로 전환한다.
//  
List list = Stream.of("hello you", "hello me")
    .flatMap(line -> Arrays.stream(line.split(" "))).collect(Collectors.toList());

System.out.println(list);   // [hello, you, hello, me]

스파크 워드카운트 케이스랑 좀 닮은 것 같지 않아요?

3.2.4 reduce


그 매개 변수는 BinaryOperator<T>로 하나의 Optional 대상을 되돌려준다. Optional은 그 결과가 있을 수도 있고 없을 수도 있다(예를 들어 빈 값의Stream 흐름 작업이 있을 때 초기 값을 지정하지 않았을 때) 귀약 작업에 사용된다는 것을 설명한다.
//  
Integer res = Stream.of(1, 2, 3).reduce((acc, element) -> acc + element).get();

//  6 ,Stream reduce , Optional, 6 , Integer
Integer res2 = Stream.of(1, 2, 3).reduce(6, (acc, element) -> acc + element);

System.out.println(String.format("res: %s, res2: %s", res, res2));  // res: 6, res2: 12

4 참조


《Java 8 Lambdas, Richard Warburton 저서(O'Reilly, 2014)》.
전재 대상:https://blog.51cto.com/xpleaf/2372042

좋은 웹페이지 즐겨찾기