23.03.08 Stream

김민성·2023년 3월 8일
0

애너테이션 : 소스 코드가 컴파일 되거나 실행 될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소이다.

✋표준 애너테이션 종류

@Override : 메서드 앞에만 붙일 수 있는 애너테이션으로, 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나 추상 메서드를 구현하는 메서드라는 것을 컴파일러에게 알려준다.
만약 메서드의 이름이 잘못 작성 되었을 때 @Override를 붙이지 않으면 새로운 메서드를 정의하는 것으로 간주하고 에러를 발생시키지 않는다.

@Deprecated : 기존에 사용하던 기술이 다른 기술로 대체되어 기존 기술을 적용한 코드를 더 이상 사용하지 않도록 유도한다.
기존의 코드를 다른 코드와의 호환성 문제로 삭제하기 곤란해 남겨두어야만 하지만 더 이상 사용하는 것을 권장하지 않을 때에 사용한다.

@SuppressWarnings : 컴파일 경고 메시지가 나타나지 않도록 한다. 경고가 발생할 것이 충분이 예상됨에도 묵인할 때 주로 사용한다.

@FunctionalInterface : 함수형 인터페이스를 선언할 때, 컴파일러가 함수형 인터페이스의 선언이 바르게 선언되었는지 확인하도록 한다.

🌟 람다식

함수형 프로그래밍 기법을 지원하는 자바의 문법요소로 메서드를 하나의 '식' 으로 표현한 것으로, 코드를 매우 간결하면서 명확하게 표현할 수 있다는 장점이 있다.
기본적으로 반환타입과 이름을 생략할 수 있다 -> 이 때문에 람다식을 익명 함수라 부르기도 함

람다식에선 정적/인스턴스 메서드를 참조할 수 있고 생성자 참조도 가능하다.
클래스 :: 메서드
참조 변수 :: 메서드
클래스 :: new

🌟 스트림 (Stream)

코드를 조금 더 직관적으로 이해하고 작성할 수 있게 하기 위해, 다양한 유형의 데이터를 일관된 방식으로 다룰 수 있게 하기 위해 만들어진 문법이다.

Stream : 객체 요소를 처리하는 스트림
IntStream : Int형 기본 타입 요소를 처리하는 스트림
DoubleStream : Double -
LongStream : Long -

스트림의 특징

🍙. 스트림 처리 과정은 생성, 중간 연산, 최종 연산 세 단계의 파이프라인으로 구성될 수 있다.
🍙. 스트림은 원본 데이터 소스를 변경하지 않는다.
🍙. 스트림은 일회용이다.
🍙. 스트림은 내부 반복자이다.

✍️ 스트림의 생성

배열 스트림 생성
Arrays.stream(배열명) / Stream.of(배열명)

컬렉션 스트림 생성
Collection에 정의된 stream() 메서드를 사용하여 스트림을 생성할 수 있다.
list.stream() , set.stream()

range() 나 rangeClosed() 메서드를 사용하면 다음과 같이 특정 범위의 정수 값을 스트림으로 생성해서 반환
range(int1, int2) -> int1 ~ int2 까지의 정수(int2 포함 x)
rangeClosed(int1, int2) -> int1 ~ int2 포함 까지의 정수

✍️ 스트림의 중간 연산

필터링(filter(), distinct()) : 조건에 맞는 데이터들만을 정제하는 역할을 한다.
distinct() : Stream의 요소들에 중복된 데이터가 존재하는 경우 , 중복을 제거하기 위해 사용한다.
filter() : Stream에서 조건에 맞는 데이터만을 정제 / 조건은 람다식을 사용하여 정의할 수 있다.

map() : 스트림 내 요소들에서 원하는 필드만 추출하거나 특정 형태로 변환할 때 사용한다.
flatmap() : 중첩 구조를 제거하고 단일 컬렉션으로 만들어주는 역할을 한다.

sorted() : 정렬을 할 때 사용한다. / 인자를 안 넣을 시 기본 오름차순 정렬
sorted(Comparator.reverseOrder()) : 요소들의 값을 역순으로 정렬

skip() : 스트림의 처음 n개의 요소를 건너뜀
limit() : 스트림의 요소를 최대 n개로 제한
peek() : forEach()와 마찬가지로 요소들을 순화하며 특정 작업을 수행한다.
peek() 는 중간 연산자이기 때문에 여러번 연결하여 사용할 수 있는 반면, forEach() 는 최종 연산자이기 때문에 마지막에 단 한번만 사용할 수 있습니다.

✍️ 스트림의 최종 연산

🤯 스트림의 최종 연산 메서드를 사용하면 스트림이 종료되므로 중간 연산을 다시 사용하려면 스트림을 재생성 해야 한다.

기본 집계
평균과 최댓값 최솟값을 구할 때 쓴 getAsDouble() 과 getAsInt() 는 객체로 반환되는 값을 다시 기본형으로 변환하기 위해 사용되는 메서드로 스트림 파이프라인과는 관계가 없다

매칭 : 스트림의 각 데이터 요소들이 특정한 조건을 충족하는 지 만족시키지 않는 지 검사하여, 그 결과를 boolean 값으로 반환한다.

allMatch() : 모든 요소들이 조건을 만족하는 지 여부를 판단한다
noneMatch() : 모든 요소들이 조건을 만족하지 않는 지 여부를 판단한다.
anyMatch() : 하나라도 조건을 만족하는 요소가 있는 지 여부를 판단한다.

요소 소모(reduce()) : 스트림의 요소를 줄여나가면서 연산을 수행하고 최종적인 결과를 반환한다.

요소 수집(collect()) : 요소들을 수집

0개의 댓글