[JAVA] Stream API -(1)

윤재열·2022년 10월 24일
0

Java

목록 보기
60/71
post-custom-banner

1. Stream API 란?

  • java는 객체지향 언어이기 때문에 기본적으로 함수형 프로그램이 불가능합니다.
  • 하지만 JDK8 버전부터 Stream API와 람다식,함수형 인터페이스 등을 지원해주면서 java를 이용해 함수형으로 프로그래밍할 수 있는 API 들을 제공해주고 있습니다.
  • 그중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해 두었습니다.

Stream API의 예시

Stream 사용전


String[] nameArr = {"IronMan", "Captain", "Hulk", "Thor"}
List<String> nameList = Arrays.asList(nameArr);

// 원본의 데이터가 직접 정렬됩니다.
Arrays.sort(nameArr);
Collections.sort(nameList);

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

for (String str : nameList) {
  System.out.println(str);
}
  • 물론 이방법도 좋은 코드기는 하지만 더욱 간결하고 가독성있게 정리할 수 있으며, 원본의 데이터에 변형을 가하지 않는 방법이 있습니다.

Stream 사용 후

String[] nameArr = {"IronMan", "Captain", "Hulk", "Thor"}
List<String> nameList = Arrays.asList(nameArr);

// 원본의 데이터가 아닌 별도의 Stream을 생성함
Stream<String> nameStream = nameList.stream();
Stream<String> arrayStream = Arrays.stream(nameArr);

// 복사된 데이터를 정렬하여 출력함
nameStream.sorted().forEach(System.out::println);
arrayStream.sorted().forEach(System.out::println);

2. Stream API의 특징

원본의 데이터를 변경하지 않습니다.

  • Stream API는 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도으 요소들로 Stream을 생성합니다.
  • 그렇기 때문에 원본의 데이터로부터 읽기만 할 뿐이며, 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리가 됩니다.
List<String> sortedList = nameStream.sorted().collect(Collections.toList());

Stream은 일회용 입니다.

  • Stream API는 일회용이기 때문에 한번 사용이 끝나면 재사용이 불가능합니다.
  • 그렇기 때문에 또 필요한 경우에는 Stream을 다시 생성해주어야 합니다.
  • 만약 사용이 끝난 Stream 을 다시 사용한다면 IllegalStateException이 발생하게 됩니다.

내부 반복으로 작업을 처리합니다.

  • Stream을 이용하면 코드가 간결해지는 이유는 '내부 반복' 때문입니다. 기존에는 반복문을 사용하기 위해서 for 또는 while 등을 사용했지만. Stream에서는 그러한 반복 문법을 메서드 내부에 숨기고 있기때문에, 간결하게 코드 작성이 가능합니다.
nameStream.forEach(System.out::println);

3. Stream API의 연산 종류

Stream API의 3가지 단계
1. 생성하기
2. 가공하기
3. 결과생성

1. 생성하기

  • Stream은 객체를 생성하는 단계
  • Stream은 재사용이 불가능하므로, 닫히면 다시 생성이 필요합니다.
  • Stream 연산을 하기 위해서는 먼저 Stream 객체를 생성해주어야 합니다.
  • 배열,컬렉션,파일 등 거의 모든 것을 가지고 스트림을 생성할 수 있습니다.

2. 가공하기

  • 원본의 데이터를 별도의 데이터로 가공하기 위한 중간 연산
  • 연산결과를 Stream으로 다시 반환하기 때문에 연속해서 중간 연산을 이어갈 수 있습니다.

3. 결과 만들기

  • 가공된 데이터로부터 원하는 결과를 만들기 위한 최종 연산
  • Stream의 요소들을 소모하면서 연산이 수행되기 때문에 1번만 처리가 가능합니다.

4. Stream 3단계 연산 예제

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()							// 생성하기
    .filter(s -> s.startsWith("c"))			// 가공하기
    .map(String::toUpperCase)			// 가공하기
    .sorted()							// 가공하기
    .count();							// 결과만들기
  • 위의 코드에서 먼저 stream()을 통해 Stream 객체를 생성하고 있습니다.
    그리고 원하는 데이터를 필터링,변형, 정렬하는 중간 연산을 하고있습니다.
  • 위의 예제에서는 count()를 반환하여 남아이쓴 요소의 개수를 최종적으로 반환하도록 되었습니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글