Stream

알파로그·2023년 3월 12일
0

알고리즘 스킬

목록 보기
17/19

✏️ Stream 의 특징

다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것

  • 데이터 소스 : Collection (Set, List, Map) , Array …

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

  • 원본에 영향을 주지안고 작업을 할 수 있음

일회성으로 사용 가능하며 다시 필요할 경우 스트림을 생성해야 한다.


📍Stream 작동 과정

데이터 소스 → Stream → 중간 연산 → 최종연산 (결과)

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, ... );

list.stream().  // 스트림 생성

.distinct().limit(3).sorted() // 중간연산 (3가지 작업 실행)

.forEach(System.out :: println) // 최종연산 (한번만 실행할 수 있음)

⚙️ Method 1. Stream 생성

📍 stream()

Collection 을 stream 으로 변환 하는 기능

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> strm = list.stream();

📍 of()

특정 요소를 Stream 으로 생성하는 기능

Stream<Integer> strm = Stream.of(1, 2, 3, 4);

📍 기본형 스트림 ( IntStream , LongStream, DoubleStream … )

기본형 data type 을 사용할 수 없고 꼭 참조형 data type 만 사용해야 하는 stream 의 특성상 타입변환을 해서 사용해야하는데,

이 때 기본형 스트림을 사용하면 코드의 효율과 가독성을 높힐 수 있다.

IntStream intstrm = IntStream.of(1, 2, 3, 4 );

⚙️ Method 2. 중간 연산

연산결과가 스트림인 연산 (반복적으로 적용가능)

📍 distinct()

Stream 의 요소중 중복되는 값을 제거하는 기능

List<Integer> list = Arrays.asList(1, 2, 2, 2, 3);

list.stream().distinct().forEach(System.out :: print);
// 123

📍 filter()

stream 의 index 를 조건을 만들어 필터링 할 수 있는 기능

  • filter() 는 괄호 안의 내용으로 람다식을 사용한다.
List<String> list = Arrays.asList(
				"banana" , "apple", "are" , "cat"
);

List <String> a = list.stream()
				// startsWith : 앞글자가 "a" 인경우만 true
				.filter(name -> name.startsWith("a"))
				.collect(Collectors.toList());

System.out.println(a);  // [apple, are]

📍 reduce()

stream 의 index 총 합을 계산하는 기능

List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

System.out.println(
				list.stream()
						.reduce((x,y) -> x + y).get()
);

📍 min() / max()

stream 의 index 중 가장 작은 값과 가장 큰 값을 찾아주는 기능

  • min()
List<Integer> list = Arrays.asList( 8, 3, 6, 12, 7, 2 );

System.out.println(
			list.stream()
					.min(Comparator.comparing(x ->x)).get()
); // 2
  • max()
List<Integer> list = Arrays.asList( 8, 3, 6, 12, 7, 2 );

System.out.println(
			list.stream()
					.max(Comparator.comparing(x ->x)).get()
); // 12

📍 parallel()

대용량 stream 을 병렬로 변경해 작업의 효율을 높히는 기능

  • stream 뒤에 붙여주고 다음부터는 동일하게 작업하면 됨
stream.parallel()  // <- 병렬로 변경
.distinct().limit(5000).sorted()
.forEach(System.out :: println)

⚙️ Method 3. 최종 연산

연산결과가 스트림이 아닌 연산 (단 한번만 사용가능하며 스트림 요소를 소모함)

📍 forEach()

모든 요소를 return 한후 stream 을 종료하는 기능

  • for 문의 기능과 동일해 요약해놨다고 생각하면됨
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

Stream<Integer> strm = list.stream();

strm.forEach(System.out :: print); //12345

//-----  아래 코드와 동일한 기능  ---------------//        

for (Integer i : list)
		System.out.print(i); //12345

📍 count()

stream 내 요소의 갯수를 return 하는 기능

List<String> list = Arrays.asList(
                "book", "desk", "keyboard", "mouse", "cup"
        );

        int count = (int) list.stream()  // 스트림 생성
                .filter(w -> w.contains("o")) // 필터링
                .count();  // index 갯수 확인

        System.out.println(count);  // 3

📍 collect(Collectors. )

stream 의 중간연산을 거친 index 들을 원하는 형태로 파싱해주는 기능

  • Collectors.toList()
List<String> list = Arrays.asList(
				"banana" , "apple", "are" , "cat"
);

List <String> a = list.stream()
				.filter(name -> name.startsWith("a"))
				.collect(Collectors.toList());

System.out.println(a); // [apple, are]
  • Collectors.joining()
List<String> list = Arrays.asList(
                "banana" , "apple", "are" , "cat"
        );

        System.out.println(
                list.stream()
                        .filter(name -> name.startsWith("a"))
                        .collect(Collectors.joining(", "))
        ); // apple, are
profile
잘못된 내용 PR 환영

0개의 댓글