Stream

배지원·2023년 12월 14일
0

JAVA

목록 보기
32/32

1. 스트림이란?

  • 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
  • 컬렉션(Collection)이나 배열 등의 데이터를 처리하는데 사용되는 편리하고 강력한 도구
  • 스트림은 데이터의 연속된 흐름을 나타내며, 데이터의 처리를 일관성 있게 다룰 수 있도록 도와준다.

2. 구조

  • 중간 연산과 최종 연산으로 구성이 되어 있다.

    중간연산 : 연산결과가 스트림인 연산, 반복적으로 적용가능
    최종연산 : 연산결과가 스트림이 아닌 연산, 단 한번만 적용가능(스트림의 요소를 소모)


    Ex.) stream.distinct( ).limit(5).sorted( ).forEach(System.out::println)일때, forEach만 최종연산이고 나머지는 중간연산에 속함


3. 특징

(1) 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다.

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]

(2) 스트림은 Iterator처럼 일회용이다.

strStream.forEach(System.out::println);		// 스트림 최종연산으로 인해 닫힘
int num = strStream.count();				// 스트림 호출 불가

(3) 스트림은 작업을 내부 반복으로 처리한다.

  • 성능은 비효율적이지만 코드가 간결해짐
[기존]
 for(String str : strList)
     System.out.println(str);
     
[Stream 사용] 
stream.forEach(System.out::println);

(4) 기본형 스트림 - IntStream, LongStream, DoubleStream

  • 오토박싱 & 언박싱의 비효율이 제거됨(Stream[Integer] 대신 IntStream 사용)
  • 숫자와 관련된 유용한 메서드를 Stream[T] 보다 많이 제공

4. 실습(스트림 만들기)

  • 배열 -> 스트림
- 기본형일때
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);		// 파일을 읽어 파일내용을 라인 단위로 저장

5. 실습(스트림 중간연산)

  • 스트림 자르기
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);	// 이중 필터 가능
  • 스트림 정렬하기(Sorted)
    • Comparator의 comparing( )으로 정렬 기준을 ㅈ공
// 정렬 기준 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)
profile
Web Developer

0개의 댓글