본문

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 사용


  1. List<String> names = new ArrayList<>();
  2. for (Student student : students) {
  3. if(student.getName().startsWith("A")){
  4. names.add(student.getName());
  5. }
  6. }

- internal iterations (of Stream)

내부적으로 elements를 반복하는 foreach, map, filter 등의 methods 가 존재


  1. List<string> names = students.stream().map(Student::getName).filter(name->name.startsWith("A"))
  2. .collect(Collectors.toList());



- Operations on Streams

  1. List<String> names = students.stream()
  2. .map(Student::getName)
  3. .filter(name->name.startsWith("A"))
  4. .limit(10)
  5. .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


  1. IntStream.rangeClosed(1, 10).forEach(num -> System.out.print(num));
  2. // ->12345678910
  3. IntStream.range(1, 10).forEach(num -> System.out.print(num));
  4. // ->123456789



- Building Streams

  1. //Creating Stream of hardcoded Strings and printing each String
  2. Stream.of("This", "is", "Java8", "Stream").forEach(System.out::println);
  3. //Creating stream of arrays
  4. String[] stringArray = new String[]{"Streams", "can", "be", "created", "from", "arrays"};
  5. Arrays.stream(stringArray).forEach(System.out::println);
  6. //Creating BufferedReader for a file
  7. BufferedReader reader = Files.newBufferedReader(Paths.get("File.txt"), StandardCharsets.UTF_8);
  8. //BufferedReader's lines methods returns a stream of all lines
  9. reader.lines().forEach(System.out::println);


- NIO API와 IO API가 Streams를 지원하도록 업데이트 되었다.

ㆍ파일에서 읽어오는 행의 스트림을 직접 생성














공유

댓글