[JAVA] 스트림 (Stream)

unoung·2022년 5월 25일
1

JAVA

목록 보기
4/6

스트림이란?

  • 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기위해 for문과 Iterator를 사용해서 코드를 작성해왔다. 그러나 이러한 방식으로 작성된 코드는 너무 길고 재사용성이 떨어진다.
  • 또 다른 문제는 데이터 소스마다 다른 방식으로 다뤄야 한다는 것.
    ex) List를 정렬할 때는 Collection.sort() 사용, 배열을 정렬
    👉 이러한 문제점을 해결하기 위해서 만든 것이 '스트림(Stream)'이다.
    • 스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을
      정의해 놓았다.(재사용성 증가)
    • 스트림을 이용하면, 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있다.
    • 스트림이 제공하는 기능에는 중간 연산과 최종 연산이 있다.
    stream.distinct().limit(5).sorted().forEach(System.out::println);
    	   //중간연산    중간연산   중간연산             최종연산

🖥 코드 작성해보기

//예를 들어
String[] strArr = {"aaa","bbb","ccc"};
List<String> strList = Arrays.asList(strArr);

// 이 두 데이터 소스를 기반으로 하는 스트림은
Stream<String> strStream1 = strList.stream(); //스트림 생성
Stream<String> strStream2 = Arrays.stream(strArr); //스트림 생성

strStream1.sorted().forEach(System.out::println);
strStream2.sorted().forEach(System.out::println);
// 데이터 소스를 읽어서 정렬 후 출력

❗️두 스트림의 데이터 소스는 서로 다르지만,정렬하고 출력하는 방법은 완전히 동일하다


스트림의 특징

1. 스트림은 데이터 소스를 변경하지 않는다
👉 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐, 변경하지는 않는다.
필요하다면 정렬된 결과를 컬렉션이나 배열에 담아서 반환 가능

List<String> sortedList = strStream2.sorted().collect(Collectors.toList());
//정렬된 결과를 새로운 List에 담아서 반환한다

2. 스트림은 일회용이다
👉스트림은 한번 사용하면 닫혀서 다시 사용할 수 없다. 필요하면 다시 스트림을 생성해야 한다.

strStream1.sorted().forEach(System.out::println);
int num = strStream1.count(); // Error. 스트림 이미 닫힘

3. 스트림은 작업을 내부 반복으로 처리한다
👉 내부 반복이라는 것은 반복문을 메서드 안에 숨겼다는 것을 의미한다. forEach()는
스트림에 정의된 메서드 중 하나로 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용한다.

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

stream.forEach(System.out::println);

// 즉, forEach()는 메서드 안으로 for문을 넣은 것이다.

✅ 핵심

스트림은 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것!



출처: 자바의 정석(도서,유튜브)

profile
복습 블로그

0개의 댓글