중간연산 : 연산결과가 스트림인 연산, 반복적으로 적용가능
최종연산 : 연산결과가 스트림이 아닌 연산, 단 한번만 적용가능(스트림의 요소를 소모)
Ex.) stream.distinct( ).limit(5).sorted( ).forEach(System.out::println)일때, forEach만 최종연산이고 나머지는 중간연산에 속함
List<Integer> list = Arrays.asList(3,1,5,4,2);
List<Integer> sortedList = list.stream().sorted()
.collect(Collectors.toList());
System.out.println(list); // [3,1,5,4,2]
System.out.println(sortedList); // [1,2,3,4,5]
strStream.forEach(System.out::println); // 스트림 최종연산으로 인해 닫힘
int num = strStream.count(); // 스트림 호출 불가
[기존]
for(String str : strList)
System.out.println(str);
[Stream 사용]
stream.forEach(System.out::println);
- 기본형일때
int[] arr = {1,2,3,4,5};
IntStream intStream = Arrays.stream(arr);
intStream.forEach(System.out::println);
- 객체 타입 일때
Integer[] arr = {1,2,3,4,5};
Stream<Integer> intStream = Arrays.stream(arr);
intStream.forEach(System.out::println);
IntStreamintStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 5개의 요소만 출력한다.
IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림을 반환
IntStream intStream = IntStream.range(1,5); // 1,2,3,4
IntStream intStream1 = IntStream.rangeClosed(1,5); // 1,2,3,4,5
Stream<Integer> intStream = Stream.iterate(0, n -> n+2);
intStream.limit(10)
.forEach(System.out::println); // 0 2 4 6 8 10 12 14 16 18
Stream<Integer> oneStream = Stream.generate(() -> 1);
oneStream.limit(10)
.forEach(System.out::println); // 1 1 1 1 1 1 1 1 1 1
----------------------------------------------------------------
iterate(T seed, UnaryOperator f) : 입력을 한개 넣으면 한개의 결과 출력
generate(Supplier s) : 입력없이 출력만 하는 것
// Path dir = 파일 또는 디렉토리
Stream<File> fileStream = Files.list(Path dir); // 파일 리스트 저장
Stream<String> filelines = Files.lines(Path dir); // 파일을 읽어 파일내용을 라인 단위로 저장
IntStream intStream = IntStream.rangeClosed(1,10); // 12345678910
intStream.skip(3).limit(5).forEach(System.out::print); // 45678 (1~3까지 skip, 그 이후 번호부터 5개 limit)
IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6);
intStream.distinct().forEach(System.out::print); // 123456 (distinct를 통해 중복 제거)
IntStream intStream = IntStream.rangeClosed(1,10); // 12345678910
intStream.filter(i -> i%2==0).forEach(System.out::print); // 246810 (2의 배수만 출력)
intStream.filter(i -> i%2==0 && i%3==0).forEach(System.out::print); // 6 (2의 배수면서 3의 배수 출력)
or
intStream.filter(i -> i%2==0).filter(i -> i%3==0).forEach(System.out::print); // 이중 필터 가능
// 정렬 기준 1개
studentStream.sorted(Comparator.comparing Student:getBan) // 반별로 정렬
.forEach(System.out::println);
// 정렬 기준 2개 이상
studentStream.sorted(Comparator.comparing Student:getBan)
.thenComparing(Student::getTotalScore) // 총점별로 정렬
.forEach(System.out::println);
// file -> String
Stream<File> fileStream = Stream.of(new File("Ex1.java"), new File("Ex1"));
Stream<String> filenameStream = fileStream.map(File::getName); // File -> String 형 변환
// Entity -> Dto
service.test().map(ArticleDto :: from)