날아라쩡글이의 블로그입니다.

Stream메소드 사용법 (자바 8버젼이상) 본문

중앙 HTA (2106기) story/java API story

Stream메소드 사용법 (자바 8버젼이상)

날아라쩡글이 2022. 1. 3. 14:03
반응형

java 8부터 추가된 API이다. 

  • 배열이나 콜렉션에 저장된 데이터를 처리하기 위해서 도입했다. 
    • 이전에는 for문과 iterate를 사용해서 처리했다. 
  • 다양한 방식으로 저장된 데이터를 처리하기 위한 공통적인 처리방법을 제공한다. 
    • 배열과 콜렌션, 파일에 저장된 데이터를 통일시켜버린다. 

stream API의 특징

  • 내부방법을 통해서 작업을 수행한다. 
    • List<Integer> numbers = List.of(10,20,30,40,50);
      for(int num : numbers) {
      System.out.println(num);
      //외부반복
      }
    • numbers.stream().forEach(job -> System.out.println(num));
      //람다식을 이용한 내부반복
  • 스트림은 단 한번만 사용가능하다. 일회용이다. 
    • 연결하려면, stream()을 반환해야한다. 
  • forEach -> 최종연산후에는 사용할 수 없다. 
  • 스트림은 원본데이터를 변경하지 않는다. 
    • 특별한 객체가 있어서 원본데이터의 복사본이 들어간다. 원본데이터의 변경없이 작업이 가능하다. 
  • 병렬처리를 쉽게 처리할 수 있다. 
  • CPU내부에는 Core가 여러개가 존재한다. 자바 8이전에는 core1개에서만 CollectionData를 많이 작업했다.
    core여러개를 사용하면 빨리 작업이 가능한데, 자바 8이후로는 Stream이 병렬처리를 지원해주었다. 
    ParalleStream()이 멀티 코어를 내부적으로 사용한다. stream()은 일반 코어 사용한다. 

stream API의 동작흐름

  • stream API는 [스트림의 생성 -> 스트림의 중간연산(스트림의 변환) -> 스트림의 최종연산(스트림의 사용)]의 순서로 사용된다. 
  • 스트림의 중간연산은 스트림을 반환한다. 
  • stream의 동작흐름에서 스트림 중간연산은 2개이상의 연산을 포함할 수 있다. 
    • 스트림의 생성 -> 스트림의 중간연산 ->스트림의 중간연산 ->스트림의 중간연산 ->스트림의 최종연산
    • ex) List<Job> jobs = jobService.getAllJobs();
      job.stream() //스트림의 생성 , Job객체를 순서대로 처리하는 stream의 객체 Stream<Job>
      .map(job -> job.getMinSalary()) //스트림의 중간연산 Stream<Integer>정수를 순서대로처리하는 Stream객체
      .distinct() //스트림의 중간연산 , 중복이 제거된 정수를 순서대로 처리하는 Stream객체 Stream<Integer>
      .sorted() //스트림의 중간연산, Stream<Integer>반환 //오름차순으로 정렬 
      .collect(Collectors.toList())
      //스트림의 최종연산 List<Integer>반환, 더이상 스트림이 반환되지 않게 최종연산으로 void를 반환한다. 
  • stream의 동작흐름에서 스트림의 중간연산을 생략할 수 있다. 
    • ex)List<Integer> numbers = List.of(10,20,30,40,50);
      number.stream()//스트림의 생성
      .forEach(num->System.out.println(num))//스트림의 최종연산 = void

stream의 생성

  • stream은 다양한 데이터 소스로 부터 stream<T>를 생성할 수 있다. 
  • 데이터소스 : 콜렉션, 배열, 파일, 지정된 범위의 연속된 정수, 난수 를 의미한다. 
  • ex) Stream<T> stream = List<T>.stream()//콜렉션
    Stream<T> stream = Arrays.stream(T[])//배열
    IntStream stream = IntStream.range(1, 10)//1~9까지의 범위내의 숫자를 구할 수 있다. 
    IntStream stream = IntStream.rangeClosed(1, 10)//1~10까지의 범위내의 숫자를 구할 수 있다. 

stream의 중간연산 

  • 제일 중요하다. 
  • 다양한 데이터 소스로부터 생성된 초기 스트림을 다른 스트림으로 변환하는 연산이다. 
  • 중간연산은 스트림을 전달받아서 스트림을 반환하기 때문에 중간연산을 여러개 연결해서 사용할 수 있다. 
  • 중간연산의 종류
    • ? super T
      • T타입, T의 부모가 ?에 와야한다. , 하위 한정, 
    • ? extends R 
      • R이거나 R의 자식들이 와야한다. 상위한정
    • 필터링
      • filter(Predicate), distinct() //걸러내다 
      • filter(Predicate<? super T> predicate) 
      • filter(Predicate<T> {
        public boolean test(T t); //T에 대한 테스트를 수행해서 true혹은 false같이 반환되는 메소드를 구현한다.
        })
        • List<Student> students = List.of(...);
          Students.stream().filter(Student -> Student.getAverage() >= 60);
          // 60점 이상인 학생만 필터링된다. 
    • 변환
      • map(function), faltmap(function)//바꾼다.
      • map(function<? super T, ? extends R> mapper)
        문자에 대해서 배열이 3개가 생기고, 배여렝 들어'간' stream이 3개가 생긴다. 
      • faltmap : 
        문장단위로 읽어들이기 때문에 하나의 stream으로 바뀌게 되고, 합쳐지게 된다. 
        한문장들이 뭉쳐지는 것이 아닌, stream안에 존재하게 된다. 
    • 제한 
      • limit(), skip()//건너뛰다
    • 정렬
      • sorted()//정렬
      • sorted(Comparator <? super T> comparater)

stream의 최종연산

  • stream 최종연산을 통해서 스트림의 각 요소를 소모하거나 결과를 표시한다. 
  • 최종연산이 완료된 스트림은 더 사용할 수 없다. 
  • 최종연산의 종료 
    • 요소의 출력
      • forEach()
      • forEach(Cunsumer<? super T> action)
    • 요소의 소모
      • reduce()
    • 요소의 검색
      • findFrist()
      • findAny()
    • 요소의 검사 
      • anyMatch()
      • allMatch()
      • noneMatch()
    • 요소의 통계
      • count()
      • min()
      • max()
    • 요소의 연산
      • sum()
      • average()
    • 요소의 수집
      • collector(colectors.toList())
      • collector(colectors.toSet())
반응형

'중앙 HTA (2106기) story > java API story' 카테고리의 다른 글

Optional  (0) 2022.01.04
I/O(Data, Object)와 직렬화  (0) 2021.10.18
I/O  (0) 2021.10.14
사용자 정의 예외 처리 , 앞으로 코딩 작성 방법(맨 밑)  (0) 2021.10.13
Formating (포맷팅)  (0) 2021.10.08
Comments