본문 바로가기
Java Tutorial

[Java] 스트림 (Stream) +Optional 클래스

by 미소5 2024. 7. 2.
  • 스트림: 데이터의 연속적인 흐름. 다양한 데이터소스(컬렉션, 배열)를 표준화된 방법으로 다루기위한 것.
List<String> list = Arrays.asList("kim", "hong", "park");

/* Iterator 이용 */
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){	
String name=iterator.next();
System.out.println(name);
}
//kim	hong	park
List<String> list = Arrays.asList("kim", "hong", "park");

/* Stream 이용 -> 간결해진 코드 */
Stream<String> stream = list.stream();
//리턴타입: Stream<T>
//메소드: stream()
//소스: 컬렉션

stream.forEach( name-> System.out.println(name) );
//kim	hong	park

스트림 파이프라인

  • 스트림의 3단계
    1.  스트림 만들기 (소스: 컬렉션 List Set Map, 배열 등)
    2.  중간연산 (연산결과가 스트림)
      • 0~n번. 여러번 적용 가능
    3.  최종연산 (연산결과가 스트림이 아님)
      • 0~1번. 한번만 적용 가능. 스트림의 요소를 소모
stream.distinct().limit(5).sorted().forEach(System.out::println)
//스트림.중간연산(중복제거.5개자르기.정렬).최종연산(출력)

스트림의 종류 : 기본형스트림(BaseStream) - IntStream, LongStream, DoubleStream
  • 스트림의 종류
    • 오토박싱&언박싱의 비효율이 제거됨 (Stream<Integer> 대신 IntStream 사용) → 성능↑
    • 숫자와 관련된 유용한 메소드를 Stream<T> 보다 더 많이 제공

 


  • 중간처리 기능
    • 필터링 : 요소를 걸러낸다
      • 중복 제거  distinct() 
      • 조건 필터링  filter() 
    • 정렬 sorted()
  • 최종처리 기능
    • forEach()
    • 기본집계
      • 요소개수count(), 총합sum(), 평균average(), 최대값max(), 최소값min()
      • findFirst() findAny()  filter 조건에 일치하는 요소 1개 리턴
        • findFirst()는 가장 앞에 있는 요소(첫번째 요소)를 리턴
        • findAny()는 실행할 때마다 리턴 값이 달라짐

  • 스트림의 특징
    • 스트림은 데이터 소스로부터 데이터를 읽기만 할 뿐, 변경하지 않는다.
    • 스트림은 Iterator처럼 일회용이다. (필요하면 다시 스트림을 생성해야 한다)
    • Stream과 Iterator의 차이점?
      • Stream은 최종연산 전까지 중간연산이 수행되지 않는다. (→ "지연된 연산")
      • Stream은 작업을 내부 반복으로 처리 → 병렬로 처리  (여러개의 스레드가 처리)

  •   병렬스트림 생성 메소드
    • parellelStream(), parallel()

  •  Optional 클래스
      • Optional클래스들이 제공하는 메소드
        • isPresent() : Optional객체의 값이 null이면 false, 아니면 true를 반환 (null이 아닐때만 작업수행하는 경우에 사용)
      • null을 직접 다루는것은 위험 (NullpointerException), null 체크하려면 if문으로 코드 지저분해짐     →간접적으로 null을 다루는 Optional<T>
      •  Optional<T> 
        • T타입 객체의 래퍼클래스  (T타입이란?  모든 타입의 객체를 저장 가능한 타입)
기본형값을 감싸는 래퍼클래스 값을 반환하는 메소드
Optional get()
OptionalInt getAsInt()
OptionalLong  getAsLong()
OptionalDouble getAsDouble()
둘다 OptionalInt에 0을 저장한다 value isPresent() 
OptionalInt.of(0); 0 true
OptionalInt.empty(); 0 false

  • Optional<T> 객체 생성하기
String s="abc";
Optional<String> x=Optional.of(s);
Optional<String> x=Optional.of("abc");

//Optional<String> x=Optional.of(null);	//error! NullpointerException발생
Optional<String> x=Optional.ofNullable(null);

//Optional<String> x= null; //error!
Optional<String> x=Optional.empty();	//null대신, 빈 Optional<T> 객체를 사용!

  • Optional<T> 객체의 값 가져오기
x.get(); 	//x에 저장된 값 반환 (null이면 예외발생)

x.orElse(""); 	///x에 저장된 값이 null일 때는, ""를 반환
x.orElseGet(String::new);	//람다식 사용 가능

x.orElseThrow(NullPointerException::new);	//null이면 예외발생
728x90
반응형

'Java Tutorial' 카테고리의 다른 글

[Java] Map컬렉션  (1) 2024.07.14
[Java] 인터페이스 (interface)  (0) 2024.06.16
[Java 필수 지식] 접근제어자  (0) 2024.06.08
[Java] StringBuilder 클래스  (0) 2023.07.24
[Java] 예외 처리  (0) 2023.07.02