10. 좀더상세히
Id : 1
Value : 100
Id : 3
Value : 80
Id : 6
Value : 120
Id : 10
Value : 50
Id : 7
Value : 40
Stream <Transaction)
Id : 3
Value : 80
Id : 6
Value : 120
Id : 10
Value : 50
.filter(t ->t.getType()
==Transaction.GROCERY)
Stream <Transaction)
Id : 6
Value : 120
Id : 3
Value : 80
Id : 10
Value : 50
.sorted(
Comparator.comparing(
Transaction::getValue).reversed())
Stream <Transaction)
6
3
10
.map(Transaction::getId)
Stream <Integer)
6
3
10
.collect(Collectors.toList());
List<Integer)
09:18:25
11. Stream API
•Java.util.stream
•연산의선언적서술
•반복구조캡슐화, 알고리듬분리
•제어흐름추상화
•함수형방식처리: 데이터불변
•지연처리, 대부분의작업을단일반복수행으로처리
•무한연속데이터흐름API
•다양한데이터원천지원: 컬렉션, 생성메서드, 파일I/O 등
09:18:25
Java 8에 추가된 기능인 Steam API에 대해서 알아 보도록 하죠.
혹시 자바 8 사용하고 있는 조직 있나요?
있으면 그분한테 물어보는게 더 확실하게 알 수 있습니다. ㅎ
저는 글로만 배워서 흑흑..
2014년 3월에 java 8이 출시 됬습니다.
위 같은 다양한 기능들이 같이 추가 됬는데, 이번 발표에서는 STEAM API에 대해서만 알아 보도록 하죠
이 코드는 구매내역중에서 식료품점에서 쇼핑을 하고 사용금액 순으로 정렬을 한 뒤 거래 내역의 ID를 추출하는 코드 입니다.
뭐 다들 이렇게 작성하시고, 딱히 다른 특이점 도 없습니다.
그럼 다른 언어에서는 어떻게 하는지 한번 비교 해보죠
데이터베이스에서는 이처럼 한줄의 쿼리만 작성하면 됩니다.
자바와는 다르게 매우 간단하죠?
정렬이 필요 하면 order by 를 쓰면 되고, 집계 관련 작업이 필요하면 이미 등록되어 있는 집계 함수를 사용하면 됩니다
다시 한번 자바코드를 매의 눈으로 살펴보조..
음.. 쿼리와 단순 비교하는게 좀 그렇긴 하지만
일단 코드 길이가 길어고 복잡합니다. 반복문도 2개나 있고, 거기다가 반복문안에서 조건 체크까지…
더욱 심각한건 이모든걸 다 코딩을 해줘야 됩니다.
그래서 준비 했습니다!! 물론 제가 준비한건 아니고..
이전의 자바 코드를 자바 8의 스트림을 사용하면 이렇게 작성할 수 있습니다.
한눈에 좀 들어 오시나요?
익숙하지 않은 코드가 숨어 있는데…
바로 람다 표현식과 메소드 참조 입니다.
람다 표현식이 자바 8의 꽃이라고 할 수 있는데…
지금은 이런게 있다라고 하고 넘어 가도록 하죠.
정리해서 기술공유에 올리긴 할텐데 그게 언제가 될지…
이전 코드를 기준으로 일반적인 스트림이 어떻게 진행되는지 알아 보도록 하죠
일단 스트림을 실행시키기 위해서는 데이터 소스가 필요 합니다. 위에서는 거래 내역의 목록이라는 컬렉션을 데이터 소스로 사용했죠
그런 다음에는 중간 작업으로 불리는 메서드들을 연결합니다. 이 중간 작업들은 stream을 반환하기 때문에 서로 연결되서 체인처럼 사용할 수 있는데, jquery 사용해보신 분들은 익숙하실 꺼에요. jquery에서는 메서드 체인으로 부르는데 자바에서는 이런 방식을 fluent interface라고 하는데.. 뭐 직역해보면 유창한? 능수능란한? 자연스럽게 연결해서 사용할 수 있는 거라고 생각하시면됩니다.
이렇게 연결된 중간작업들을 파이프 라인이라고 하고 이는 종료 작업을 통해서 수행됩니다.
스트림을 사용해서 코드를 작성할때 중간작업까지만 만들고 컴파일후실행하면 해당 스트림은 실행되지 않고, 종료 작업이 호출될때만 수행됩니다. 이른 늦은 실행이라고 하는데 laziness loading 과 같은 개념이라고 보면 됩니다.
거래 내역 목록이 이처럼 구성 되어 있다고 합시다.
처음으로 하는 작업은 식료품점에서 구매한 내역인지 먼저 필터링을 하고
그 다음 가격순으로 정렬을 하고
id를 추출해서 새로운 list로 생성합니다.
그럼 컬렉션과 스트림은 어떻게 다르냐
컬레션들을 자료들을 보관하기 위한 자료 구조라고 보면 되고
스트림은 이를 처리하기 위한 처리 추상화 자료 구조라고 보면 됩니다.
다른 예를 들어보면 비디오 랜탈샵에 있는 비디오들을 구성하고 있는 프레임이나 바이트들을 컬렉션 데이터로 보면 되고
이를 재생하는 것을 스트림으로 보면됩니다.
네이버뮤직, 멜론같은 음악 스트리밍, 유튜브같은 동영상 스트리밍도 같은 의미라고 보면 됩니다.
종료 작업인 collec를 사용하면 list, set, map으로 결과를 반환할 수 있고
이 외에도 집계 함수를 사용할 수 있다. .groupingBy, averagingInt, sumarizingInt