본문
170420(목) - Streams <Understanding Java 8 Streams API
Streams
Lambda를 효과적으로 사용할 수 있도록 API에 람다를 대폭 적용
대표적인 예가 "Stream"
ㆍCollection을 파이프식으로 처리하도록 하면서 고차함수로 그 구조를 추상화 함.
ㆍparallelism 및 concurrency를 위해서 태어났다.
ㆍforking
large task를 sub task로 쪼갠다.
ㆍjoining
결과 도출을 위해 sub task를 다시 합친다.
ㆍCollection과 비슷한 매커니즘
- Collection VS Streams
ㆍcollection
- elements를 포함하는 memory내의 데이터 구조
- 각 elements는 collection이 되기전에 계산됨
ㆍstreams
- 요청이 있을때 elements를 계산하는 고정형 데이터 구조
- 사용자의 요청이 있을때 값이 계산되는 Lazily constructed collections로 볼 수 있다.
- Deeper Look at Streams
ㆍpackage : java.util.stream
ㆍAggregate Operations 지원
- filter
- map
- reduce
- find
- match
- sort
ㆍpipelining 및 internal iterations 지원
- 대부분의 스트림 조작이 Streams 만을 리턴하도록 설계 되어있다.
- Pipelining : 이러한 설계는 Stream operations chain을 만드는데 도움이 됨
- pipelined operations는 SQL 쿼리와 비슷하게 보인다.
ㆍexternal & internal iterations
- external iterations
collections를 반복하기위해 loop 혹은 iterators 사용
List<String> names = new ArrayList<>();
for (Student student : students) {
if(student.getName().startsWith("A")){
names.add(student.getName());
}
}
- internal iterations (of Stream)
내부적으로 elements를 반복하는 foreach, map, filter 등의 methods 가 존재
List<string> names = students.stream().map(Student::getName).filter(name->name.startsWith("A"))
.collect(Collectors.toList());
- Operations on Streams
List<String> names = students.stream()
.map(Student::getName)
.filter(name->name.startsWith("A"))
.limit(10)
.collect(Collectors.toList());
ㆍterminal operations
- 중간에 streams를 반환하기 때문에 pipeline 형성이 가능하다.
- pipeline의 끝부분에 있으며, meaningful way로 스트림을 닫는 작업
- foreach : 모든 elements operations 동작. 반환값은 없음.
- 가장 흥미롭고 중요한 부분은 "Lazy"하다는 것이다.
- larger data Streams processing에 매우 중요한 요소는, intermediate operations는 terminal operations가 호출될 때까지 invoke 하지 않는다는 것.
- 이러한 동작방식은 performance 향상에 크게 기여한다.
- Numerical Ranges
ㆍIntStream
ㆍDoubleStream
ㆍLongStream
IntStream.rangeClosed(1, 10).forEach(num -> System.out.print(num));
// ->12345678910
IntStream.range(1, 10).forEach(num -> System.out.print(num));
// ->123456789
- Building Streams
//Creating Stream of hardcoded Strings and printing each String
Stream.of("This", "is", "Java8", "Stream").forEach(System.out::println);
//Creating stream of arrays
String[] stringArray = new String[]{"Streams", "can", "be", "created", "from", "arrays"};
Arrays.stream(stringArray).forEach(System.out::println);
//Creating BufferedReader for a file
BufferedReader reader = Files.newBufferedReader(Paths.get("File.txt"), StandardCharsets.UTF_8);
//BufferedReader's lines methods returns a stream of all lines
reader.lines().forEach(System.out::println);
- NIO API와 IO API가 Streams를 지원하도록 업데이트 되었다.
ㆍ파일에서 읽어오는 행의 스트림을 직접 생성
'Programming > Java 8' 카테고리의 다른 글
170420(목) - Streams <Terminal Operations> (0) | 2017.04.20 |
---|---|
170420(목) - Streams <Intermediate Operations> (0) | 2017.04.20 |
170420(목) - Streams <Laziness and Performance Optimization> (0) | 2017.04.20 |
170419(수) - Lambda Expressions (0) | 2017.04.19 |
170419(수) - Default Methods (0) | 2017.04.19 |
댓글