• 분류 전체보기 (512)
    • 개발남노씨(Coding Test) (6)
    • 고농축 백엔드 (17)
    • 재귀함수 DFS 총정리 (1)
    • 프론트엔드 날개달기:Vuejs.React (1)
    • 훈훈한 javascript (5)
    • 렛츠기릿 자바스크립트 (18)
    • 나도코딩 (1)
      • 웹 스크래핑 (1)
    • 프로그래머스(자바스크립트) (41)
      • LV.0(자바스크립트) (41)
    • 프로그래머스(자바) (121)
      • LV.0(자바) (56)
      • LV.1(자바) (41)
      • LV.2(자바) (23)
    • 프로그래머스(파이썬) (127)
      • LV.0(파이썬) (46)
      • LV.1(파이썬) (51)
      • LV.2(파이썬) (30)
    • 임시저장소 (31)
    • 프로젝트 (0)
    • 자바 알고리즘 (13)
      • 알고리즘 직빵 자바 문법 (10)
      • String(문자열) (3)
    • 파이썬 알고리즘 (93)
      • 알고리즘 직빵 파이썬 문법 (20)
      • 알고리즘 백준 (2)
      • 파이썬 알고리즘(사고력기르기) (6)
      • 파이썬 탐색 & 시물레이션 (8)
      • 이분탐색 & 그리디 알고리즘 (10)
      • 스택, 큐, 해쉬, 힙 (10)
      • 완전탐색과 DFS기초 (12)
      • DFS, BFS 활용 (19)
      • 동적계획법 (6)
    • 자바 (27)
      • Java TPC(생각하고, 표현하고, 코딩하고) (17)
      • Java (중요하고, 이해 안 되고, 어려운) (10)
    • 스프링 (5)
      • 스프링 MVC 패턴 2편 (5)
hELLO · Designed By 정상우.
@@#@@

기록용 블로그

자바/Java (중요하고, 이해 안 되고, 어려운)

Stream

2022. 10. 31. 13:55

Stream(스트림)

 ▶다양한 데이터 소스를 표준화된 방법으로 다루기 위한 도구

  List<Integer> list = Arrays.asList(1,2,3,4,5);
  Stream<Integer> intStream = list.stream();                            //컬렉션
  Stream<String> strStream = stream.of(new String[]{"a", "b", "c"});   //배열
  Stream<Integer> evenStream = Stream.iterate(0, n->n+2); 			   //람다식
  Stream<Double>  randomStream = Stream.generate(Math::random0;        //메서드참조
  IntStream       intStream    = new Random().ints(5);                 //난수 스트림(크기가 5)

 

Stream(스트림)의 특징

 ▶스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐 변경하지 않는다.

List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.Stream().sorted().         //list를 정렬해서
						collect(Collectors.toList());      //새로운 List에 저장
System.out.println(list);              //[3, 1, 5, 4, 2]
System.out.println(sortedList);        //[1, 2, 3, 4, 5]

 

 ▶스트림은 Iterator처럼 일회용이다.(필요하면 다시 스트림을 생성하여야 함)

strStream.forEach(System.out::println);          //모든 요소를 화면에 출력, forEach() ->최종연산
int numOfStr = strStream.count(); 				 //에러. 스트림이 이미 닫혔음

 

 ▶지연된 연산 - 최종 연산 전까지 중간연산이 수행되지 않는다.

IntStream intStream = new Random().inits(1, 46);         //1~45범위의 무한 스트림
intStream.distinct().limit(6).sorted()                   //중간연산
         .forEach(i->System.out.print(i+","));           //최종연산

→무한스트림에서 중복을 제거하고, 갯수를 제한을 하고, 정렬을 하는 것은 이론상 불가능하다.

   

   그러나 이러한 중간 연산이 가능한 이유는 Stream처리를 바로 하지 않고, 일단 중간연산을 체크만 해놓고,

 

   나중에 최종연산을 할 때 중간연산이 이루어지기 때문이다.    

 

   이러한 메커니즘을 "지연된 연산"이라고 한다.

 

 

 

 

 ▶스트림은 작업을 내부 반복으로 처리 한다.

for(String str : strList)
	System.out.println(str);

                                                                        ↓                                       ↓

 

  Stream.forEach(System.out::println);
  void forEach(Comsumer<? super T> action) {
 		Objects.requireNonNull(action);            //매개변수의 널 체크 
        
        for(T t : src)       //내부 반복(for문을 forEach메서드 안으로 넣음)
           action.accept(T);
     }

 

 ▶스트림은 작업을 내부 반복으로 처리 한다.

  Stream<String> strStream = Stream.of("dd", "aaa", "cc", "cc" 'b");
  int sum = strStream.parallel()			         //병렬 스트림으로 전환(속성만 변경)
                mapToInt(s-> s.length()).sum();      //모든 문자열의 길이의 합

 

▶기본형 스트림 - IntStream, LongStream, DoubleStream

Stream<Integer>대신 IntStream을 사용하므로써 오토박싱&언박싱의 비효율이 제거됨

IntStream, LongSteam, DoubleSteam은 숫자와 관련된 유용한 메서드를 많이 제공한다. 

 

 

저작자표시 비영리 변경금지 (새창열림)

'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글

Optional <T>  (0) 2022.10.30
메서드 참조  (0) 2022.10.30
람다 Lambda  (0) 2022.10.30
Comparable  (0) 2022.10.27
생성자  (0) 2022.10.26
    '자바/Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
    • Optional <T>
    • 메서드 참조
    • 람다 Lambda
    • Comparable
    @@#@@
    @@#@@
    자바, 스프링, 알고리즘, 깃허브, 파이썬

    티스토리툴바