- 스트림: 데이터의 연속적인 흐름. 다양한 데이터소스(컬렉션, 배열)를 표준화된 방법으로 다루기위한 것.
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단계
- 스트림 만들기 (소스: 컬렉션 List Set Map, 배열 등)
- 중간연산 (연산결과가 스트림)
- 0~n번. 여러번 적용 가능
- 최종연산 (연산결과가 스트림이 아님)
- 0~1번. 한번만 적용 가능. 스트림의 요소를 소모
stream.distinct().limit(5).sorted().forEach(System.out::println)
//스트림.중간연산(중복제거.5개자르기.정렬).최종연산(출력)
- 스트림의 종류
- 오토박싱&언박싱의 비효율이 제거됨 (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클래스들이 제공하는 메소드
-
기본형값을 감싸는 래퍼클래스 | 값을 반환하는 메소드 |
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 |