스트림
데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 추상화 함, 즉 배열이나 컬렉션뿐만 아니라 파일도 모두 같은 방식으로 다룰 수 있음
특징
1. 데이터 소스를 변경하지 않음
데이터를 읽기만 할 뿐 데이터 소스를 변경하지 않음
2. 일회용
한번 사용하면 닫혀서 다시 사용할 수 없음
3. 내부 반복으로 처리
스트림으로 작성한 코드가 간결할 수 있는 이유는 내부반복
class Stream {
void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : src) {
action.accept(t);
}
}
}
4. 연산
스트림은 마치 데이터베이스에 질의를 하는 것과 같은 느낌, 중간 연산과 최종 연산으로 분류할 수 있으며
중간 연산은 연속해서 연결할 수 있다. 반면 최종 연산은 한번만 가능하다.
- 지연된 연산, 최종 연산이 수행되기 전까지 중간 연산은 수행되지 않는다.
생성
컬랙션
컬랙션의 최고 조상인 Collection에 stream()이 정의 되어 있음, 그러므로 list, set의 구현체들은 모두 스트림을 생성할 수 있음
List<String> stringList = new ArrayList<>(Arrays.asList("김","은", "수", "김"));
Stream<String> listStream = stringList.stream();
listStream.forEach(System.out::println);
System.out.println();
Set<String> stringSet = new HashSet<>(Arrays.asList("김","은", "수", "김"));
Stream<String> setStream = stringSet.stream();
setStream.forEach(System.out::println);
배열
Stream과 Arrays에 정의되어 있음
Stream.of(T... values);
Stream.of(T[] t);
Arrays.stream(T[] t);
Arrays.stream(T[] t, int startIncluesive, int endExcluesive);
IntStream.of(int... values);
IntStream.of(int []);
특정 범위의 정수
IntStream.range(begin, end)
Intsream.rangeClosed(begin, end)
임의의 수
크기가 정해지지 않은 무한스트림이 생성되며 limit() 메서드를 사용해 제한해야함
IntStream randomIntStream = new Random().ints()
LongStream randomLongStream = new Random().longs()
IntStream randomIntStream = new Random().ints(5)
각 요소를 계산하여 스트림 생성
람다식에 의해 계산되는 값들을 무한스트림을 생성한다.
첫번째 파라미터로 지정한 값부터 시작하여 f 함수로 의해 계산된 결과를 다시 seed 값으로 설정하고 계산을 반복하며 생성한다.
Stream<T> iterate(T seed, UnaryOperator<T> f)
파라미터가 없는 람다식을 이용해 계산되는 값을 이용하여 생성한다.
Stream<T> generate(Supplier<T> s)
파일
java.nio.file.Files는 파일을 다루는데 유용한 메서드들을 제공, list()는 지정된 디렉토리에 있는 파일의 목록을 소스로하는
스트림을 리턴함
Stream<Path> pathStream = Files.list(Path dir)
파일 내용의 행을 요소로 하는 스트림
Stream<String> contentStream = Files.lines(Path path)
Stream<String> contentStream = lines(); // BufferedReader클래스
'Main > Java' 카테고리의 다른 글
[JAVA] Stream 중간연산 (0) | 2021.03.30 |
---|---|
[JAVA] 람다식 기본 (0) | 2021.03.30 |
[JAVA] Stream skip(), limit() 사용법 (0) | 2021.03.17 |
[JAVA] 리눅스 자바 한글 폰트 설정 (0) | 2020.10.20 |
[JAVA] PNG 파일에 문자열 삽입하기 (2) | 2020.10.14 |