🌱 오늘의 주제 : 스트림의 특징과 스트림의 중간연산
🌱 스트림
- for문과 Iterator를 이용해서 코드를 작성할때 너무 길고 알아보기 어려우며 재사용성이 떨어지는 단점과 데이터 소스마다 다른 방식으로 다뤄야하는 단점을 해결하기 위해 만든 것이 스트림(Stream)이다.
- 스트림은 데이터 소스를 추상화하고 자주 사용되는 메서드들을 정의해 놓았다.
Stream<String> str = strList.stream(); // 스트림 생성
str.sorted().forEach(System.out::println); // 스트림 출력
🌱 스트림의 특징
- 스트림은 데이터를 읽기만 할 뿐, 데이터 소스를 변경하지 않는다.
- 스트림은 일회용이다.
- 스트림은 작업을 내부 반복으로 처리한다. 예를 들어, 반복문을 메서드의 내부에 숨겼다는 것을 의미한다.
- 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다. 최종 연산이 수행되어야 비로소 스트림의 요소들이 중간 연산을 거쳐 최종 연산에서 소모된다.
- 기본형을 다루는 스트림 IntStream, LongStream, DoubleStream이 제공된다.
- 스트림의 장점 중 하나는 병렬 처리가 쉽다는 것이다. 자동적으로 연산을 병렬로 수행한다. parallel() 메서드와 sequential()메서드를 이용하면 된다.
🌱 스트림의 연산
- 연산이란 스트림에 정의된 메서드 중에서 데이터 소스를 다루는 작업을 수행하는 것을 의미한다.
- 중간 연산 : 연산 결과가 스트림의 연산. 스트림에 연속해서 중간 연산할 수 있음.
- 최종 연산 : 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 단 한번만 가능.
stream.distinct().limit(5).sorted().forEach(System.out::println)
-------- ------- -------- -----------------------------
중간연산 중간연산 중간연산 최종연산
🌱 스트림의 연산 - 중간연산
🌱 스트림의 중간연산 - map()
- map() : 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 쓴다.
package chapter14;
import java.io.File;
import java.util.stream.Stream;
public class ex14_6 {
public static void main(String[] args) {
// 스트림의 중간연산 - map()
File[] fileArr = {new File("Ex1.java"), new File("Ex1.bak"), new File("Ex1.java"), new File("Ex1"), new File("Ex1.txt"), };
Stream<File> fileStream = Stream.of(fileArr);
//map() 으로 Stream<File>을 Stream<String>으로 변환
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println); // 모든 파일의 이름을 출력
fileStream = Stream.of(fileArr); // 스트림을 다시 생성
fileStream.map(File::getName) // Stream<File> -> Stream<String>
.filter(s -> s.indexOf('.') != -1) // 확장자가 없는 것은 제외
.map(s -> s.substring(s.indexOf('.') + 1)) // 확장자만 추출
.map(String::toUpperCase) //모두 대문자로 변환
.distinct() // 중복 제거
.forEach(System.out::print); // JAVABAKTXT
System.out.println();
}
}
------
Ex1.java
Ex1.bak
Ex1.java
Ex1
Ex1.txt
JAVABAKTXT
'Java' 카테고리의 다른 글
Java - 스트림의 최종연산 (0) | 2023.04.04 |
---|---|
Java - Optional<T> (0) | 2023.04.03 |
Java - 람다식 (0) | 2023.03.27 |
Java - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); (0) | 2023.03.23 |
Java - 쓰레드의 동기화 & wait()과 notify() (0) | 2023.03.23 |