Free Lines Arrow
본문 바로가기
Language/Java

[Java] Stream API

by skahn1215 2021. 8. 23.
728x90
반응형

Stream API

  • 스트림은 API는 데이터를 추상화하여 다룬다.
  • 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다.
  • 배열, 컬렉션, 파일에 저장된 데이터 모두 같은 방법으로 다룰수 있다.

 

 

등장배경

  • 자바에서는 데이터를 저장하기위해 배열, 컬렉션을 사용한다.
  • 반복문 또는 반복자를 사용해서 접근을 해야되는데
  • 매번 새로운 코드를 작성해야 되며 가독성이 떨어진다.
  • 스트림은 이런문제를 극복하기 위해 도입되었다.

 

 

 

특징

  • 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리 내부 반복(internal iteration)을 통해 작업을 수행한다.
  • 스트림은 재사용이 가능한 컬렉션과는 달리 단 한 번만 사용할 수 있다.
  • 스트림은 원본 데이터를 변경하지 않습니다.
  • 스트림의 연산은 필터-맵(filter-map) 기반의 API를 사용하여 지연(lazy) 연산을 통해 성능을 최적화 한다.
  • 스트림은 parallelStream() 메소드를 통한 손쉬운 병렬 처리를 지원한다.

 

 

스트림의 동작 단계

1. 스트림 생성

2. 스트림 중개연산(스트림 변환)

3. 스트림 죄종연산(스트림의 사용)

 

 

 

스트림 생성

스트림 API는 다음과 같은 다양한 데이터 소스에서 생성할 수 있다.

  • 컬렉션
    - stream() 메소드가 존재한다.

  • 배열
    - Arrays.stream() 메소드를 사용한다.

  • 가변 매개변수
    - Stream..of() 를 사용한다.

  • 지정된 범위의 연속된 정수
    - 1~10 까지의 정수를 생성할수 있다.
    - IntStream.range(1, 10); 1~9 까지만 생성마지막 수는 포함 안함
    - IntStream.rangeClosed(1, 10); 1~10 까지 생성

  • 특정 타입의 난수들
    - IntStreamstream = newRandom().ints(4); 4개의 랜덤수 생성

  • 람다 표현식
    - iterate() 메소드는 시드(seed)로 명시된 값을 람다 표현식에 사용하여 반환된 값을 다시 시드로 사용하는 방식으로 무한 스트림을 생성한다.
    - IntStream stream = Stream.iterate(2, n -> n + 2); // 2, 4, 6, 8, 10, ...

  • 파일
    - java.io.BufferedReader 클래스의 lines() 메소드를 사용하면 파일뿐만 아니라 다른 입력으로부터도 데이터를 행(line) 단위로 읽어 올수 있다.
    - String<String> stream = Files.lines(Path path);

  • 빈 스트림
    아무 요소도 가지지 않는 빈 스트림은 Stream 클래스의 empty() 메소드를 사용하여 생성할 수 있습니다.
    - Stream<Object> stream = Stream.empty();

 

스트림의 중개 연산(intermediate operation)

스트림 API에 의해 생성된 초기 스트림은 중개 연산을 통해 또 다른 스트림으로 변환할수 있다.

 

 

중개연산 종류

  • 스트림 필터링 : filter(), distinct()
  • 스트림 변환 : map(), flatMap()
  • 스트림 제한 : limit(), skip()
  • 스트림 정렬 : sorted()
  • 스트림 연산 결과 확인 : peek()

 

스트림 필터링 

filter() 메소드는 해당 스트림에서 주어진 조건(predicate)에 맞는 요소만으로 구성된 새로운 스트림을 반환한다.

InStream stream1 = InStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);
stream1.distinct().forEach(e -> System.out.print(e + " "));

IntStream stream2 = IntStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);
stream2.filter(n -> n % 2 != 0).forEach(e -> System.out.print(e + " "));

 

 

스트림 변환 

  • map() 메소드는 해당 스트림의 요소들을 주어진 함수에 인수로 전달한다음
    반환값들로 이루어진 새로운 스트림을 반환한다.

  • 스트림의 요소가 배열이라면, flatMap() 메소드를 사용하여
    각 배열의 각 요소의 반환값을 하나로 합친 새로운 스트림을 얻을 수 있다.
Stream<String> stream = Stream.of("HTML", "CSS", "JAVA", "JAVASCRIPT");
stream.map(s -> s.length()).forEach(System.out::println);

 

 

 

스트림 제한

  • limit() 메소드는 해당 스트림의 첫 번째 요소부터 전달된 수만큼 새로운 스트림을 반환한다.
  • skip() 메소드는 해당 스트림의 첫 번째 요소부터 전달된 수만큼의 요소를 제외한후 새로운 스트림을 반환한다.
IntStream stream1 = IntStream.range(0, 10);
IntStream stream2 = IntStream.range(0, 10);
IntStream stream3 = IntStream.range(0, 10);

stream1.skip(4).forEach(n -> System.out.print(n + " "));

System.out.println();

stream2.limit(5).forEach(n -> System.out.print(n + " "));

System.out.println();

stream3.skip(3).limit(5).forEach(n -> System.out.print(n + " "));

 

 

 

스트림정렬

  • sorted() 메소드는 해당 스트림을 주어진 비교자(comparator)를 이용하여 정렬한다.
  • 비교자를 전달하지 않으면 기본적으로 사전 편찬 순(natural order)으로 정렬한다.
Stream<String> stream1 = Stream.of("JAVA", "HTML", "JAVASCRIPT", "CSS");
Stream<String> stream2 = Stream.of("JAVA", "HTML", "JAVASCRIPT", "CSS");


stream1.sorted().forEach(s -> System.out.print(s + " "));

System.out.println();

 
stream2.sorted(Comparator.reverseOrder()).forEach(s -> System.out.print(s + " "));

 

 

 

스트림 연산 결과 확인

peek() 메소드는 결과 스트림으로부터 요소를 소모하지 않는다.

여러번 사용해도 문제가 되지 않는다.

 

IntStream stream = IntStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);

 
stream.peek(s -> System.out.println("원본 스트림 : " + s))

    .skip(2)

    .peek(s -> System.out.println("skip(2) 실행 후 : " + s))

    .limit(5)

    .peek(s -> System.out.println("limit(5) 실행 후 : " + s))

    .sorted()

    .peek(s -> System.out.println("sorted() 실행 후 : " + s))

    .forEach(n -> System.out.println(n));

 

 

 

 

 

 

참고: http://tcpschool.com/java/java_stream_intermediate

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] java8 에 추가된 기능  (0) 2021.08.23
[Java] Join() 과 StringJoiner  (0) 2021.08.23
[Java] static  (0) 2021.08.23
[Java] Interface, Abstract  (0) 2021.08.23
[Java] Exception(예외)  (0) 2021.08.23

댓글