Java -17

김정현·2024년 5월 2일
0

JAVA

목록 보기
19/25

Stream

: 데이터 소스가 무엇이든 간에 같은 방식을 다룰 수 있게 데이터를 추상화하고 데이터를 다루는 메서드를 정의해 놓음

  • 배열, 컬렉션 등 stream 객체로 변환하면 동일한 방식으로 처리 가능
    -편의 기능

  • 스트림은 데이터 소스를 변경하지 않는다.

  • 스트림은 일회용

  • 스트림은 작업을 내부 반복으로 처리

스트림 만들기

1) 컬렉션
Collection
-> Stream stream()
스트림은 List, Set 구현객체만 생성가능
일반 스트림만 생성 가능: Stream<E>

2) 배열
Arrays
-> static stream(....)

3) 일반 : IntStream, DoubleStream,
Stream
-> .of(T... )

스트림의 연산

1) 중간연산
- 스트림 중간 부분에 정의된 메서드
- 반환값이 Stream인 형태
- 최종 연산이 호출 될떄 까지는 연산 X

2) 최종연산
- 가장 끝에 추가된 메서드
- 반환값이 Stream이 아닌 형태

3) 지연된연산
중간 연산은 최종 연산이 호출되어야 스트림을 소비하면서 연산이 진행 된다.
3. 기본자료형을 다루는 스트림

IntStream 
LongStream 
DoubleStream 
	->  오토박싱, 언박싱이 발생 X -> 성능상 이점
	-> 숫자 관련 편의 기능 추가(예 - 통계 관련 기능)


일반 스트림 -> 기본 자료형 스트림으로 변환 메서드 
mapToInt   : IntStream 
mapToLong : LongStream
mapToDouble : DoubleStream

기본 자료형 스트림 -> 일반 스트림 변환 메서드 
boxed()

예) 
IntStream -> Stream<Interger>
LongStream -> Stream<Long>

IntStream에는 정렬기능 sorted() 메서드 1개만 정의

->

그런데 일반 스트림 Stream에서는 sorted()와 sorted(Comparator ..)가 정의 되어 있다.

->

IntStream을 일반 스트림인 Stream<Integer> 로 변환하면 sorted(Comparator ..) 통해서 정렬

스트림 활용
1. 생성하기
Collection::stream() : 일반 스트림
Arrays.stream(...) : 일반스트림 + 기본 자료형 스트림

Stream.of(T.... ) : 일반스트림, 기본 자료형 스트림

1) 특정 범위의 정수
기본 자료형 스트림
- 횟수가 정해진 반복을 할때
range(int s, int e) : s이상 e미만
rangeClosed(int s, int e): s이상 e이하

2) 임의의 수
java.util.Random
무한 스트림 - 갯수 제한이 필요

	IntStream ints();  : 정수범위 난수 
	LongStream longs() : 
	DoubleStream doubles() : 실수 범위 난수
	

3) 람다식 - iterate(), generate()
- 무한스트림

4) 두 스트림의 연결 - concat()

  1. 스트림의 중간 연산
    1) skip(), limit()

limit() : 갯수 제한
skip() : 건너 뛰기

2) filter(), distinct()
filter(Predicate<T> ...) : 스트림을 걸러주는 기능

distinct() : 중복 제거
- 중복 제거 기준 : equals() and hashCode()

3) sorted()
- 정렬 : 기본 정렬 기준 java.lang.Comparable int compareTo(...)
- sorted(Comparator ....)
- 대안적인 기준 : java.util.Comparator :: int compare(....)

4) map()
map(Function<T,R> ...) : 변환 메서드

5) peek()
- forEach와 매개변수가 동일
- Stream peek(Consumer ... ) : 중간 연산 : 중간에 값을 확인할 경우 많이 사용
- void forEach(Consumer ...) : 최종 연산 : 최종적으로 출력할때 사용

6) mapToInt(), mapToLong(), mapToDouble()

Optional

  • 목적
    : NullPointerException 오류 대책

    null에 대한 다양한 처리 방식을 제공하는 클래스

  • 특징

    -값이 null인지 아닌지를 체크해보려면 값을가지고 있어야 함

 class Optional<T> {
  ...
  private final value;
  ...
}
  • Optional 객체의 값 가져오기
    T get() : null 이면 오류 발생
    T orElse(T other) : null이 아니면 값 반환, null이면 other 반환
    T orElseGet(Supplier<T ... > ) : null이 아니면 값 반환, null이면 Supplier::get() 함수에서 생성한 값을 반환
    -값에 대한 변경, 코드 추가가 필요한 경우
    T orElseThrow() : null이면 예외 발생(NoSuchElementException 발생)
    T orElseThrow(Supplier<T ... > ) : null이면 Supplier의 get() 생성한 예외를 발생

OptionalInt, OptionalLong, OptionalDouble

-기본형을 처리하는 optional 클래스
-오토박싱, 언박싱 발생 X -> 성능상의 이점

참고) 중간 연산 flatMap : 중첩된 스트림을 -> 일차원적 스트림으로 변환

스트림의 최종 연산

1)forEach(Consumer<T>) - 반복 작업 수행

2)allMatch(), anyMatch(), nonMatch(), findMatch(), findAny()
boolean allMatch(Predicate ...) : 모든 요소가 조건에 참일때 참
boolean anyMatch(Predicate ...) : 어떤 요소든 조건이 하나라도 참이면 참
boolean nonMatch(Predicate ...) : 전부 거짓일때 참
T findFirst() : 가장 첫번째 스트림의 요소를 반환

count(), sum(), average(), max(), min()

long count() : 요소의 갯수 - 일반 스트림(Stream<T>), 기본 자료형 스트림(IntSteram, LongStream, DoubleStream)

기본 자료형 스트림(Int Stream, LongStream, Doublestream)
long sum() : 합계
optionalDOuble averager() 평균

  • 참고) reduce()

    반환값이 첫번째 매개변수로 돌아감.
int total = Arrays.stream(scores).reduce(0, (n1, n2) -> n1 + n2);

Collect()

java.util.stream.Collectors
toList(), toSet(), toMap(), toCollection(), toArray()

-toMap() : 키, 값
-toCollection() : List, Set의 하위 클래스 객체
만약 ArrayList 변환? , HashSet, TreeSet로 변환 이때는 toCollection 사용

joining() : 스트림 요소를 특정 문자로 결합해서 문자열로 생성

groupingby() : 특정 값을 가지고 그룹
partitioningBy() : 양분(참, 거짓)

               MapBoolean, List<...>

flatMap : 중간 연산

0개의 댓글