Java8 함수식 프로그래밍 (2): 스파크 RDD 산자의 Stream 흐름 조작
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>
이지만 이때R
는 Stream
로 한정되어 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.