728x90
다양한 데이터 소스(컬렉션, 배열 등)를 표준화된 방법으로 다루기 위한 것
- 스트림 생성
- 중간연산 : 연산결과가 스트림인 연산으로 반복연산 가능
- 최종연산 : 연산결과가 스트림이 아닌 연산으로 스트림의 요소를 소모하기 때문에 단 한번만 적용 가능
스트림의 특징
스트림은 데이터 소스(원본)로부터 데이터를 읽기만하고 변경은 하지 않음
일회용이라 다시 사용하려면 스트림을 새로 생성해야 함
최종 연산 전까지 중간 연산이 수행되지 않음
작업을 내부 반복으로 처리함 (성능은 떨어지지만 코드가 간결해짐)
작업을 병렬로 처리하는 병렬스트림으로 멀티쓰레드와 비슷
오토박싱과 언박싱의 비효율을 처리하기 위해 기본형 스트림 지원
스트림 생성
// 컬렉션 >> 스트림
List<Integer> list = Arrays.asList(1,2,4,5,3,6);
Stream<Integer> intStream - list.stream();
// 배열 >> 스트림
Stream<String> strStream = Stream.of("a", "b", "c"); // 가변 인자라 길이가 무한함
Stream<String> strStream = Stream.of(new String[]{"a", "b", "c"});
Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"});
Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 3); // 필요한 만큼만
// 기본형 배열 >> 스트림
IntStream IntStream.of(int 요소들);
IntStream IntStream.of(int[]);
IntStream Arrays.stream(int[]);
// 임의의 수 >> 스트림
IntStream intStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 무한 스트림에 제한을 줌
IntStream intStream = new Random().ints(5); // 개수를 지정한 유한 스트림
// 특정 범위 정수 >> 스트림
IntStream intStream = IntStream.range(시작범위, 끝범위(포함안됨));
IntStream intStream = IntStream.rangeClosed(시작범위, 끝범위(포함));
// 람다식(iterate, generate) >> 스트림 (무한 스트림)
// iterate는 이전 요소를 seed로 해서 다음 요소 계산
static <T> Stream<T> iterate(T seed(초기값), UnaryOperator<T> f(람다식)) // 이전 요소에 종속적
// generate는 seed를 사용하지 않음
static <T> Stream<T> generate(Supplier<T> s(람다식)) // 이전 요소에 독립적
// 파일 >> 스트림
Stream<Path> f = Files.list(Path dir(폴더경로) //지정 폴더의 파일들의 경로
Stream<String> f = Files.lines(Path path) // lines 메소드는 파일 내용을 라인 단위로 읽어옴
Stream<String> f = Files.lines(Path path, Charset cs)
Stream<String> f = lines() // BufferedReader 클래스의 메소드
// 빈 스트림 생성
Stream emptyStream = Stream.empty(); // empty 메소드는 빈 스트림을 생성해서 반환
// 스트림 종류 변경
sequential() // 기본값
parallel() // 병렬스트림
스트림 중간 연산
// 제거 및 제외
distinct() // 중복을 제거
filter(조건식) // 조건에 해당하지 않는 요소 제외
limit(long maxSize) // 지정 크기까지만 스트림의 일부를 잘라냄
skip(long n) // 앞에서 부터 스트림의 n개를 건너 뜀
//정렬
sorted() // 기본 정렬
sorted(Comparator.reverseOrder()) // 역순 정렬
sorted(String.CASE_INSENSITIVE_ORDER) // 대소문자 구분없는 기본 정렬
sorted(String.CASE_INSENSITIVE_ORDER.reversed()) // 대소문자 구분없는 역순 정렬
sorted(Comparator.comparing(String::length)) // 길이순 정렬
sorted(Comparator.comparingint(String::length)) // 오토박싱 없음
sorted(Comparator.comparing(String::length).reversed()) // 길이순 역순 정렬
sorted(람다식/메소드참조)
// Comparator.comparing() : 정렬 기준 제공
studentStream.sorted(Comparator.comparing(Student::getBan)) // 학생 객체의 학생들을 반별로 정렬
// thenComparing : 추가 정렬 기준 제공
.thenComparing(Student::getName) // 반별로 정렬할 때 이름별로 정렬도 하고 싶은 경우
peek() // 스트림의 요소를 소비하지 않고 중간 결과를 볼 수 있음
// 스트림의 요소 변환
// 예시
// 파일의 정보가 담긴 파일 스트림을
Stream<File> fileStream = Stream.of(new File(파일1), new File(파일2), new File(파일3))
// 파일의 이름만 추출해서 파일명 스트림으로 변환
Stream<String> filenameStream = fileStream.map(File::getNaem);
map() //
// 스트림의 스트림을 스트림으로 변환 (간장공장공장장...)
// {"abc", "def", "jkl" }, {"ABC", "GHI", "JKL"} 스트링 배열 스트림을 map을 사용해서 변환하면
// Stream<Stream<String>> 스트림의 스트림이 만들어짐
// Stream<String> 으로 만들기 위해 사용하는 것이 flatMap
Stream<String> strStream = strArrStream.flatMap(Arrays::stream);
스트림 최종 연산
// 스트림의 모든 요소에 지정된 작업을 수행
forEach() // 병렬스트림인 경우 순서가 보장되지 않음
forEachOrdered() // 병렬스트림인 경우도 순서가 보장
// 조건 검사
allMatch(조건식) // 모든 요소가 조건을 만족시켜야 true
anyMatch(조건식) // 한 요소라도 조건을 만족시키면 true
noneMatch(조건식) // 모든 요소가 조건을 만족시키지 않아야 true
// filter + findAny(), findFirst()
findAny() // 병렬 스트림에서 사용하며 조건에 맞는 아무 요소나 하나를 반환
findFirst() // 순차 스트림에서 사용하며 조건에 맞는 첫 번째 요소를 반환
// 스트림의 요소를 하나씩 줄여가며 누적연산 수행
reduce(
identity(초기값), // 많이 사용
accumulator(수행할 연산), // 많이 사용
combiner((병렬 처리된 결과를 합치는데 사용할 연산-병렬스트림))
)
// 스트림의 그룹화 연산
// collect에 필요한 메서드를 정의해놓은 Collector 인터페이스를 매개변수로 받음
// Collectors 클래스가 인터페이스를 이미 다 구현해놨기 때문에 직접 구현할 필요 없음
collect(Collector collector)
// Collectors 클래스
toList(), toSet(), toMap, toCollection() // 스트림을 컬렉션으로 변환
toArray() // 스트림을 배열로 변환해주지만 타입을 지정 안해주면 기본으로 오브젝트 타입
counting(), summingInt(), maxBy(), minBy() // 그룹별로 통계를 낼 수 있음
reducing() // 그룹별 reduce
joining() // 문자열 스트림의 요소를 모두 연결
count()
max()
min()
스트림 그룹화 및 분할
// 스트림 2분할
partitioningBy()
// 스트림 n분할
groupingBy()
'Java > Notion' 카테고리의 다른 글
BigInteger (0) | 2023.05.08 |
---|---|
Optional<T> (0) | 2023.05.03 |
Lambda (0) | 2023.05.03 |
Thread (0) | 2023.05.02 |
애너테이션 (0) | 2023.05.02 |