SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
자바8 스트림 API 소개
최범균, 2013-06-03
자바 7, 6, 5, ...
int sum = 0;
int count = 0;
Collection<Employee> emps = …
for (Employee emp : emps) {
if (emp.getSalary() > 100_000_000) {
sum += emp.getSalary();
count++;
}
}
double avg = (double)sum / count;
how 중심:
employee 목록에서 개별
employee를 구해서
salary가 1억이 넘으면
sum에 salary를 더하고 개
수를 1증가
sum과 count로 평균 계산
자바 8 스트림 API
Collection<Employee> emps = …
OptionalDouble avgOpt =
emps.stream()
.filter(x -> x.getSalary() > 100)
.mapToInt(x -> x.getSalary())
.average();
double avg = avgOpt.getAsDouble();
what을 기술:
employee 중에서
salary가 100보다 큰
Employee의
salary를 구해서
평균을 구함
스트림 API: 세 단계 구성
emps.stream().filter(x -> x.getSalary() > 100).count();
스트림 생성 중개 연산 종단 연산
스트림 변환 스트림 사용
스트림 종류
● Stream<T>: 범용 스트림
● IntStream: 값 타입이 int인 스트림
● LongStream: 값 타입이 long인 스트림
● DoubleStream: 값 타입이 double인 스트림
스트림 생성
● 다양한 방식의 스트림 생성 방법 제공
o Collection: 콜렉션객체.stream()
o Files: Stream<String> Files.lines()
o BufferedReader: Stream<String> lines()
o Arrays: Arrays.stream(*)
o Random: Random.doubles(*), ints(*), longs(*)
o Stream:
 Stream.of(*)
 range(start, end), rangeClosed(start, end)
● IntStream, LongStream에서 제공
 Stream.generate(Supplier<T> s)
 Stream.iterate(T seed, UnaryOperator<T> f)
스트림 중개 연산
● 주요 중개 연산: 상태 없음
o Stream<R> map(Function<? super T, ? extends R> mapper)
 입력 T 타입 요소를 R 타입 요소로 변환한 스트림 생성
o Stream<T> filter(Predicate<? super T> predicate)
 조건을 충족하는 요소를 제공하는 새로운 스트림 생성
o Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
 T 타입 요소를 1:N의 R 타입 요소로 변환한 스트림 생성
o Stream<T> peek(Consumer<? super T> action)
 T 타입 요소를 사용만 하고, 기존 스트림을 그대로 제공하는 스트
림 생성
o Stream<T> skip(long n)
 처음 n개의 요소를 제외하는 스트림 생성
o Stream<T> limit(long maxSize)
 maxSize 까지의 요소만 제공하는 스트림 생성
o mapToInt(), mapToLong(), maptToDouble()
간단 샘플
Path path = Paths.get("src/test/resources/apache.log");
try(Stream<String> lines = Files.lines(path)) {
OptionalDouble optionalDouble = lines
.map(s -> parseApacheLog(s))
.filter(log -> log.getStatusCode() == 200)
.mapToInt(log -> log.getResponseTime())
.average();
System.out.println(
optionalDouble.isPresent() ?
optionalDouble.getAsDouble() : "none");
}
스트림 중개 연산
● 주요 중개 연산: 상태 있음
o sorted(), sorted(Comparator<T> comparator)
 정렬된 스트림을 생성
 전체 스트림의 요소를 정렬하기 때문에, 무한 스
트림에 적용할 수 없음
o distinct()
 같은 값을 갖는 요소를 중복해서 발생하지 않는
스트림 생성
스트림 종단 연산
● Stream 타입의 주요 종단 연산자
o void forEach(Consumer<? super T> con)
o long count()
o Optional<T> max(Comparator<? super T> comparator)
o Optional<T> min(Comparator<? super T> comparator)
o boolean allMatch(Predicate<? super T> predicate)
o boolean anyMatch(Predicate<? super T> predicate)
o boolean noneMatch(Predicate<? super T> predicate)
● IntStream, LongStream, DoubleStream
o sum(), min(), max()
o OptionalDouble average()
스트림 종단 연산
● reduce 연산
o Optional<T> reduce(BinaryOperator<T>
accumulator)
o T reduce(T identity, BinaryOperator<T> accumulator)
o <U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner)
reduce 사용 예
// reduce(BinaryOperator<T> accumulator)
Optional<Integer> result = numbers.stream()
.reduce((x, y) -> x > y ? x : y);
// reduce(T identity, BinaryOperator<T> accu)
Integer multi = numbers.stream()
.reduce(1, (x, y) -> x * y);
// reduce(T identity, BiFunction<U, T, U> biFun, BinaryOperator<U> accu)
Double reduce = numbers.parallelStream()
.reduce(0.0,
(val1, val2) -> Double.valueOf(val1 + val2 / 10),
(val1, val2) -> val1 + val2 );
스트림 종단 연산
● collect 연산: 스트림 요소 수집
o <R, A> R collect(Collector<? super T, A, R> collector)
 T: 입력 타입, A: 결과 축적용 타입, R: 최종 타입
● Collector 인터페이스 메서드
o Supplier<A> supplier(): A 객체 생성
o BiConsumer<A, T> accumulator(): 결과 축적
o BinaryOperator<A> combiner(): 부분 결과들을 합칠 때 사용
o Function<A, R> finisher(): A를 최종 타입 R로 변환
o Set<Characteristics> characteristics(): 힌트
 CONCURRENT: 다중 쓰레드에서 실행 가능
 UNORDERED: 순서에 상관 없음
 IDENTITY_FINISH: A와 R이 같은 타입
collect 직접 구현 예…. 드럽게 복잡
List<String> names = Arrays.asList("a", "aa", "aaa", "aa", "a", "aaa", "a", "aaaa", "aaa");
Map<Integer, Integer> lengthCountMap = names.stream().collect(new Collector<String, Map<Integer, Integer>, Map<Integer, Integer>>() {
@Override public Supplier<Map<Integer, Integer>> supplier() {
return HashMap::new;
}
@Override public BiConsumer<Map<Integer, Integer>, String> accumulator() {
return (map, val) -> {
int key = val.length();
Integer count = map.get(key);
if (count == null) count = 0;
map.put(key, count + 1);
};
}
@Override public BinaryOperator<Map<Integer, Integer>> combiner() {
return (map1, map2) -> {
Map<Integer, Integer> result = new HashMap<>();
map1.forEach((k, v) -> {
if (map2.containsKey(k)) result.put(k, v + map2.get(k));
else result.put(k, v);
});
map2.forEach((k, v) -> { if (!map1.containsKey(k)) result.put(k, v); });
return result;
};
}
@Override public Function<Map<Integer, Integer>, Map<Integer, Integer>> finisher() {
return x -> x;
}
@Override public Set<Characteristics> characteristics() {
Set<Characteristics> result = new HashSet<>();
result.add(Characteristics.IDENTITY_FINISH);
result.add(Characteristics.UNORDERED);
return result;
}
});
몇 가지 Collector 구현 제공
● Collectors.toList()
o List<Employee> colMap = empList.stream()
.filter(e -> e.salary() > ONE_M).collect(toList());
● Collectors.toSet()
o Set<Integer> lengthSet = names.stream()
.map(x -> x.length()).collect(Collectors.toSet());
● Collectors.toMap()
o Map<Integer, String> lengthMap = names.stream()
.collect(Collectors.toMap(
x -> x.length(), // 요소에서 key 생성
Function.identity(), // 요소에서 value 생성
(v1, v2) -> v1 + "," + v2) // 같은 key를 갖는 값을 합침
);
몇 가지 Collector 구현 제공
● Collectors.groupingBy
o Map<String, List<Employee>> colMap = empList.stream()
.collect(groupingBy(e -> e.getLevel()));
o colMap의 key는 level, value는 같은 level 값을 가지는 Employee의 리
스트
● Collectors.partioningBy
o Map<Boolean, List<Employee>> pMap = empList.stream()
.collect(partitioningBy(e -> e.salary() > ONE_M));
o pMap의 키는 true/false, value에는 조건(salary() > ONE_M)을 충족 또
는 충족하지 않는 Employee 목록
몇 가지 Collector 구현 제공
● Collectors.summarizingInt()
o double과 long에 대한 메서드 제공
o IntSummaryStatistics stat =
intStream.collect(summarizingInt());
● XXXSummaryStatistics
o long getCount()
o XXX getSome()
o XXX getMin(), getMax()
o double getAverage()
최대한 연산 지연
● 스트림은 최대한 연산을 지연
Stream<Integer> filteredStream =
Arrays.asList(1, 2, 3, 4, 5)
.stream()
.filter(x -> x > 2);
Stream<Integer> doubledStream =
filteredStream.map(x -> x * 2);
long count = doubledStream.count();
count()를 실행할 때 까지
filter와 map을 실행하지
않음
병렬 처리
● 멀티 쓰레드로 병렬 실행 가능
int sum = numberList.parallelStream()
.filter(x -> x % 2 == 0)
.sum();
동시에 다수의 쓰레드가 filter와 sum을 실행
각 쓰레드는 filter() -> sum()을 실행하고
최종적으로 각 쓰레드의 sum() 결과를 다시 sum() 함
정리
● 스트림 처리를 위한 추상화 제공
o 스트림 생성
o 중개 연산: 필터, 맵
o 종단 연산: 결과 생성(reduce), 수집(collect), 사용
(forEach)
● 지연 연산 통한 불필요한 연산 실행 최소화
o 예, stream.filter(X::isSoldOut).limit(10)
 isSoldOut이 true인 전체 요소를 검사하지 않고,
true인 것 중에서 처음 10개까지만 검사함
● 병렬 처리 지원
o 병렬 처리에 알맞게 동작하도록 종단 연산을 구현해
야 함

Weitere ähnliche Inhalte

Was ist angesagt?

Country State City Dropdown in PHP
Country State City Dropdown in PHPCountry State City Dropdown in PHP
Country State City Dropdown in PHPVineet Kumar Saini
 
Big Data Technology Stack : Nutshell
Big Data Technology Stack : NutshellBig Data Technology Stack : Nutshell
Big Data Technology Stack : NutshellKhalid Imran
 
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, Citrix
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, CitrixXPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, Citrix
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, CitrixThe Linux Foundation
 
Delight: An Improved Apache Spark UI, Free, and Cross-Platform
Delight: An Improved Apache Spark UI, Free, and Cross-PlatformDelight: An Improved Apache Spark UI, Free, and Cross-Platform
Delight: An Improved Apache Spark UI, Free, and Cross-PlatformDatabricks
 
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Julian Hyde
 
Oracle Advanced SQL and Analytic Functions
Oracle Advanced SQL and Analytic FunctionsOracle Advanced SQL and Analytic Functions
Oracle Advanced SQL and Analytic FunctionsZohar Elkayam
 
HTML 5 Tables and Forms
HTML 5 Tables and FormsHTML 5 Tables and Forms
HTML 5 Tables and FormsDoncho Minkov
 
Optimizing Application Performance - 2022.pptx
Optimizing Application Performance - 2022.pptxOptimizing Application Performance - 2022.pptx
Optimizing Application Performance - 2022.pptxJasonTuran2
 
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQuery
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQueryIntro to new Google cloud technologies: Google Storage, Prediction API, BigQuery
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQueryChris Schalk
 
ClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howAltinity Ltd
 
シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京Yu Ito
 
Java for XPages Development
Java for XPages DevelopmentJava for XPages Development
Java for XPages DevelopmentTeamstudio
 
High Availability PostgreSQL on OpenShift...and more!
High Availability PostgreSQL on OpenShift...and more!High Availability PostgreSQL on OpenShift...and more!
High Availability PostgreSQL on OpenShift...and more!Jonathan Katz
 
Jump Start with Apache Spark 2.0 on Databricks
Jump Start with Apache Spark 2.0 on DatabricksJump Start with Apache Spark 2.0 on Databricks
Jump Start with Apache Spark 2.0 on DatabricksDatabricks
 
Stored-Procedures-Presentation
Stored-Procedures-PresentationStored-Procedures-Presentation
Stored-Procedures-PresentationChuck Walker
 

Was ist angesagt? (20)

Country State City Dropdown in PHP
Country State City Dropdown in PHPCountry State City Dropdown in PHP
Country State City Dropdown in PHP
 
Big Data Technology Stack : Nutshell
Big Data Technology Stack : NutshellBig Data Technology Stack : Nutshell
Big Data Technology Stack : Nutshell
 
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, Citrix
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, CitrixXPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, Citrix
XPDDS17: PVH Dom0: The Road so Far - Roger Pau Monné, Citrix
 
Delight: An Improved Apache Spark UI, Free, and Cross-Platform
Delight: An Improved Apache Spark UI, Free, and Cross-PlatformDelight: An Improved Apache Spark UI, Free, and Cross-Platform
Delight: An Improved Apache Spark UI, Free, and Cross-Platform
 
Basics of shell programming
Basics of shell programmingBasics of shell programming
Basics of shell programming
 
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite (a tutorial given at BOSS '21)
 
Oracle Advanced SQL and Analytic Functions
Oracle Advanced SQL and Analytic FunctionsOracle Advanced SQL and Analytic Functions
Oracle Advanced SQL and Analytic Functions
 
HTML 5 Tables and Forms
HTML 5 Tables and FormsHTML 5 Tables and Forms
HTML 5 Tables and Forms
 
Optimizing Application Performance - 2022.pptx
Optimizing Application Performance - 2022.pptxOptimizing Application Performance - 2022.pptx
Optimizing Application Performance - 2022.pptx
 
Airflow at WePay
Airflow at WePayAirflow at WePay
Airflow at WePay
 
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQuery
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQueryIntro to new Google cloud technologies: Google Storage, Prediction API, BigQuery
Intro to new Google cloud technologies: Google Storage, Prediction API, BigQuery
 
HTML CSS Basics
HTML CSS BasicsHTML CSS Basics
HTML CSS Basics
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
ClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and howClickHouse Monitoring 101: What to monitor and how
ClickHouse Monitoring 101: What to monitor and how
 
シラサギハンズオン 東京
シラサギハンズオン 東京シラサギハンズオン 東京
シラサギハンズオン 東京
 
Java for XPages Development
Java for XPages DevelopmentJava for XPages Development
Java for XPages Development
 
High Availability PostgreSQL on OpenShift...and more!
High Availability PostgreSQL on OpenShift...and more!High Availability PostgreSQL on OpenShift...and more!
High Availability PostgreSQL on OpenShift...and more!
 
Jump Start with Apache Spark 2.0 on Databricks
Jump Start with Apache Spark 2.0 on DatabricksJump Start with Apache Spark 2.0 on Databricks
Jump Start with Apache Spark 2.0 on Databricks
 
CSS for Beginners
CSS for BeginnersCSS for Beginners
CSS for Beginners
 
Stored-Procedures-Presentation
Stored-Procedures-PresentationStored-Procedures-Presentation
Stored-Procedures-Presentation
 

Andere mochten auch

자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰Sungchul Park
 
Spring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSpring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSanghyuk Jung
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기rupert kim
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유knight1128
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tdd live spring camp 2013
Tdd live spring camp 2013Tdd live spring camp 2013
Tdd live spring camp 2013beom kyun choi
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)Yongho Ha
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍Jay JH Park
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발Jay JH Park
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화Jay JH Park
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝Jay JH Park
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platformJay JH Park
 

Andere mochten auch (17)

자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰java 8 람다식 소개와 의미 고찰
java 8 람다식 소개와 의미 고찰
 
Spring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSpring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDD
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
Tdd live spring camp 2013
Tdd live spring camp 2013Tdd live spring camp 2013
Tdd live spring camp 2013
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
스타트업은 데이터를 어떻게 바라봐야 할까? (개정판)
 
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
세션4. 예제로 배우는 스마트 컨트랙트 프로그래밍
 
세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발세션5. web3.js와 Node.js 를 사용한 dApp 개발
세션5. web3.js와 Node.js 를 사용한 dApp 개발
 
세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화세션3. geth 클라이언트 실습 및 모니터링과 시각화
세션3. geth 클라이언트 실습 및 모니터링과 시각화
 
세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 
세션1. block chain as a platform
세션1. block chain as a platform세션1. block chain as a platform
세션1. block chain as a platform
 

Ähnlich wie 자바8 스트림 API 소개

나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
13장 연산자 오버로딩
13장 연산자 오버로딩13장 연산자 오버로딩
13장 연산자 오버로딩유석 남
 
3주차. stream api advance
3주차. stream api advance 3주차. stream api advance
3주차. stream api advance Sejong Park
 
Functional programming
Functional programmingFunctional programming
Functional programmingssuserdcfefa
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10hungrok
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++KWANGIL KIM
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기Jongwook Choi
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)JiandSon
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14Nam Hyeonuk
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로Jaeseung Ha
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 APIArawn Park
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
람다, 스트림 Api
람다, 스트림 Api람다, 스트림 Api
람다, 스트림 ApiChi Hwan Choi
 

Ähnlich wie 자바8 스트림 API 소개 (20)

Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
Java stream v0.1
Java stream v0.1Java stream v0.1
Java stream v0.1
 
3. stream api
3. stream api3. stream api
3. stream api
 
나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
13장 연산자 오버로딩
13장 연산자 오버로딩13장 연산자 오버로딩
13장 연산자 오버로딩
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
3주차. stream api advance
3주차. stream api advance 3주차. stream api advance
3주차. stream api advance
 
Functional programming
Functional programmingFunctional programming
Functional programming
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Java advancd ed10
Java advancd ed10Java advancd ed10
Java advancd ed10
 
포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++포트폴리오에서 사용한 모던 C++
포트폴리오에서 사용한 모던 C++
 
프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기프로그래밍 대회: C++11 이야기
프로그래밍 대회: C++11 이야기
 
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
2014.07.26 KSUG와 지앤선이 함께하는 테크니컬 세미나 - 나의 첫번째 자바8 람다식 (정대원)
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
[NDC2015] C++11 고급 기능 - Crow에 사용된 기법 중심으로
 
씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API씹고 뜯고 맛보고 즐기는 스트림 API
씹고 뜯고 맛보고 즐기는 스트림 API
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
람다, 스트림 Api
람다, 스트림 Api람다, 스트림 Api
람다, 스트림 Api
 
W14 chap13
W14 chap13W14 chap13
W14 chap13
 

Mehr von beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기beom kyun choi
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)beom kyun choi
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회beom kyun choi
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료beom kyun choi
 

Mehr von beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료
 

자바8 스트림 API 소개

  • 1. 자바8 스트림 API 소개 최범균, 2013-06-03
  • 2. 자바 7, 6, 5, ... int sum = 0; int count = 0; Collection<Employee> emps = … for (Employee emp : emps) { if (emp.getSalary() > 100_000_000) { sum += emp.getSalary(); count++; } } double avg = (double)sum / count; how 중심: employee 목록에서 개별 employee를 구해서 salary가 1억이 넘으면 sum에 salary를 더하고 개 수를 1증가 sum과 count로 평균 계산
  • 3. 자바 8 스트림 API Collection<Employee> emps = … OptionalDouble avgOpt = emps.stream() .filter(x -> x.getSalary() > 100) .mapToInt(x -> x.getSalary()) .average(); double avg = avgOpt.getAsDouble(); what을 기술: employee 중에서 salary가 100보다 큰 Employee의 salary를 구해서 평균을 구함
  • 4. 스트림 API: 세 단계 구성 emps.stream().filter(x -> x.getSalary() > 100).count(); 스트림 생성 중개 연산 종단 연산 스트림 변환 스트림 사용
  • 5. 스트림 종류 ● Stream<T>: 범용 스트림 ● IntStream: 값 타입이 int인 스트림 ● LongStream: 값 타입이 long인 스트림 ● DoubleStream: 값 타입이 double인 스트림
  • 6. 스트림 생성 ● 다양한 방식의 스트림 생성 방법 제공 o Collection: 콜렉션객체.stream() o Files: Stream<String> Files.lines() o BufferedReader: Stream<String> lines() o Arrays: Arrays.stream(*) o Random: Random.doubles(*), ints(*), longs(*) o Stream:  Stream.of(*)  range(start, end), rangeClosed(start, end) ● IntStream, LongStream에서 제공  Stream.generate(Supplier<T> s)  Stream.iterate(T seed, UnaryOperator<T> f)
  • 7. 스트림 중개 연산 ● 주요 중개 연산: 상태 없음 o Stream<R> map(Function<? super T, ? extends R> mapper)  입력 T 타입 요소를 R 타입 요소로 변환한 스트림 생성 o Stream<T> filter(Predicate<? super T> predicate)  조건을 충족하는 요소를 제공하는 새로운 스트림 생성 o Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)  T 타입 요소를 1:N의 R 타입 요소로 변환한 스트림 생성 o Stream<T> peek(Consumer<? super T> action)  T 타입 요소를 사용만 하고, 기존 스트림을 그대로 제공하는 스트 림 생성 o Stream<T> skip(long n)  처음 n개의 요소를 제외하는 스트림 생성 o Stream<T> limit(long maxSize)  maxSize 까지의 요소만 제공하는 스트림 생성 o mapToInt(), mapToLong(), maptToDouble()
  • 8. 간단 샘플 Path path = Paths.get("src/test/resources/apache.log"); try(Stream<String> lines = Files.lines(path)) { OptionalDouble optionalDouble = lines .map(s -> parseApacheLog(s)) .filter(log -> log.getStatusCode() == 200) .mapToInt(log -> log.getResponseTime()) .average(); System.out.println( optionalDouble.isPresent() ? optionalDouble.getAsDouble() : "none"); }
  • 9. 스트림 중개 연산 ● 주요 중개 연산: 상태 있음 o sorted(), sorted(Comparator<T> comparator)  정렬된 스트림을 생성  전체 스트림의 요소를 정렬하기 때문에, 무한 스 트림에 적용할 수 없음 o distinct()  같은 값을 갖는 요소를 중복해서 발생하지 않는 스트림 생성
  • 10. 스트림 종단 연산 ● Stream 타입의 주요 종단 연산자 o void forEach(Consumer<? super T> con) o long count() o Optional<T> max(Comparator<? super T> comparator) o Optional<T> min(Comparator<? super T> comparator) o boolean allMatch(Predicate<? super T> predicate) o boolean anyMatch(Predicate<? super T> predicate) o boolean noneMatch(Predicate<? super T> predicate) ● IntStream, LongStream, DoubleStream o sum(), min(), max() o OptionalDouble average()
  • 11. 스트림 종단 연산 ● reduce 연산 o Optional<T> reduce(BinaryOperator<T> accumulator) o T reduce(T identity, BinaryOperator<T> accumulator) o <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
  • 12. reduce 사용 예 // reduce(BinaryOperator<T> accumulator) Optional<Integer> result = numbers.stream() .reduce((x, y) -> x > y ? x : y); // reduce(T identity, BinaryOperator<T> accu) Integer multi = numbers.stream() .reduce(1, (x, y) -> x * y); // reduce(T identity, BiFunction<U, T, U> biFun, BinaryOperator<U> accu) Double reduce = numbers.parallelStream() .reduce(0.0, (val1, val2) -> Double.valueOf(val1 + val2 / 10), (val1, val2) -> val1 + val2 );
  • 13. 스트림 종단 연산 ● collect 연산: 스트림 요소 수집 o <R, A> R collect(Collector<? super T, A, R> collector)  T: 입력 타입, A: 결과 축적용 타입, R: 최종 타입 ● Collector 인터페이스 메서드 o Supplier<A> supplier(): A 객체 생성 o BiConsumer<A, T> accumulator(): 결과 축적 o BinaryOperator<A> combiner(): 부분 결과들을 합칠 때 사용 o Function<A, R> finisher(): A를 최종 타입 R로 변환 o Set<Characteristics> characteristics(): 힌트  CONCURRENT: 다중 쓰레드에서 실행 가능  UNORDERED: 순서에 상관 없음  IDENTITY_FINISH: A와 R이 같은 타입
  • 14. collect 직접 구현 예…. 드럽게 복잡 List<String> names = Arrays.asList("a", "aa", "aaa", "aa", "a", "aaa", "a", "aaaa", "aaa"); Map<Integer, Integer> lengthCountMap = names.stream().collect(new Collector<String, Map<Integer, Integer>, Map<Integer, Integer>>() { @Override public Supplier<Map<Integer, Integer>> supplier() { return HashMap::new; } @Override public BiConsumer<Map<Integer, Integer>, String> accumulator() { return (map, val) -> { int key = val.length(); Integer count = map.get(key); if (count == null) count = 0; map.put(key, count + 1); }; } @Override public BinaryOperator<Map<Integer, Integer>> combiner() { return (map1, map2) -> { Map<Integer, Integer> result = new HashMap<>(); map1.forEach((k, v) -> { if (map2.containsKey(k)) result.put(k, v + map2.get(k)); else result.put(k, v); }); map2.forEach((k, v) -> { if (!map1.containsKey(k)) result.put(k, v); }); return result; }; } @Override public Function<Map<Integer, Integer>, Map<Integer, Integer>> finisher() { return x -> x; } @Override public Set<Characteristics> characteristics() { Set<Characteristics> result = new HashSet<>(); result.add(Characteristics.IDENTITY_FINISH); result.add(Characteristics.UNORDERED); return result; } });
  • 15. 몇 가지 Collector 구현 제공 ● Collectors.toList() o List<Employee> colMap = empList.stream() .filter(e -> e.salary() > ONE_M).collect(toList()); ● Collectors.toSet() o Set<Integer> lengthSet = names.stream() .map(x -> x.length()).collect(Collectors.toSet()); ● Collectors.toMap() o Map<Integer, String> lengthMap = names.stream() .collect(Collectors.toMap( x -> x.length(), // 요소에서 key 생성 Function.identity(), // 요소에서 value 생성 (v1, v2) -> v1 + "," + v2) // 같은 key를 갖는 값을 합침 );
  • 16. 몇 가지 Collector 구현 제공 ● Collectors.groupingBy o Map<String, List<Employee>> colMap = empList.stream() .collect(groupingBy(e -> e.getLevel())); o colMap의 key는 level, value는 같은 level 값을 가지는 Employee의 리 스트 ● Collectors.partioningBy o Map<Boolean, List<Employee>> pMap = empList.stream() .collect(partitioningBy(e -> e.salary() > ONE_M)); o pMap의 키는 true/false, value에는 조건(salary() > ONE_M)을 충족 또 는 충족하지 않는 Employee 목록
  • 17. 몇 가지 Collector 구현 제공 ● Collectors.summarizingInt() o double과 long에 대한 메서드 제공 o IntSummaryStatistics stat = intStream.collect(summarizingInt()); ● XXXSummaryStatistics o long getCount() o XXX getSome() o XXX getMin(), getMax() o double getAverage()
  • 18. 최대한 연산 지연 ● 스트림은 최대한 연산을 지연 Stream<Integer> filteredStream = Arrays.asList(1, 2, 3, 4, 5) .stream() .filter(x -> x > 2); Stream<Integer> doubledStream = filteredStream.map(x -> x * 2); long count = doubledStream.count(); count()를 실행할 때 까지 filter와 map을 실행하지 않음
  • 19. 병렬 처리 ● 멀티 쓰레드로 병렬 실행 가능 int sum = numberList.parallelStream() .filter(x -> x % 2 == 0) .sum(); 동시에 다수의 쓰레드가 filter와 sum을 실행 각 쓰레드는 filter() -> sum()을 실행하고 최종적으로 각 쓰레드의 sum() 결과를 다시 sum() 함
  • 20. 정리 ● 스트림 처리를 위한 추상화 제공 o 스트림 생성 o 중개 연산: 필터, 맵 o 종단 연산: 결과 생성(reduce), 수집(collect), 사용 (forEach) ● 지연 연산 통한 불필요한 연산 실행 최소화 o 예, stream.filter(X::isSoldOut).limit(10)  isSoldOut이 true인 전체 요소를 검사하지 않고, true인 것 중에서 처음 10개까지만 검사함 ● 병렬 처리 지원 o 병렬 처리에 알맞게 동작하도록 종단 연산을 구현해 야 함