스트림과 친해지기

김주형·2022년 11월 19일
0

자라기

목록 보기
16/22

🙇🏻‍♂️ Reference


🗓️ 메모

  • 데이터 소스로부터 데이터를 읽기만 할 뿐, 변경하지 않는다.
  • 최종 연산이 수행되기 전가지 중간 연산이 수행되지 않는다. (중간 연산 호출은 연산 지점, 작업 내용을 지정해줄 뿐)

스트림 생성

  • 스트림 소스 대상 -> 컬렉션, 배열, 임의의 수.. 다양하다.

  • 배열 소스 스트림 생성 메서드는 static 메서드로 정의되어 있다.

Stream<T> Stream.of(T... values) 
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)

람다식 - iterate(), generate()

람다식을 매개변수로 받아서, 이 람다식에 의해 계산되는 값들을 요소로 하는 무한 스트림을 생성한다.

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
static <T> Stream<T> generate(Supplier<T> s)
  • iterate() : 'seed부터 람다식 f에 의해 계산된 결과를 다시 seed값으로 계산'하는 것을 반복한다.
  • generate() : 이전 결과를 이용해서 다음 요소를 계산하지 않는다.
  • iterate()와 generate()에 의해 생성된 스트림은 기본형 스트림 타입의 참조변수로 다룰 수 없다.
// iterate()
Stream<Integer> evenStream = Stream.iterate(0, n->n+2);

// generate()
Stream<Double> randomStream = Stream.generate(Math::random);
Stream<Integer> oneStream = Stream.generate( () -> 1);

중간 연산

자르기

IntStream example = IntStream.rangeClosed(1,10);
example.skip(3).limit(5).forEach(System.out::print); // 45678

distinct() : 중복제거
filter() : 걸러내기

IntStream distinctStream = IntStream.of(1,2,2,3,3,3,3,4,5,5,6);
distinctStream.distinct().forEach(System.out::print); // 123456

IntStream filterStream = IntStream.rangeClosed(1,10);
filterStream.filter( index -> index % 2 == 0).forEach(System.out::print); // 246810

filterStream.filter( index -> index %2 != 0).filter( index -> index % 3 != 0.forEach(System.out::print); // 157
  • 정렬
    Steram sorted(Comparator<? super T> compartor)
    Stram sorted()
Stream<String> string = Stream.of("dd","aaa","CC","cc","b");
string.sorted().forEach(System.out::print); // CCaaabccdd

string.sorted(Comparator.reverseOrder()); // 역순 정렬
string.sorted(String.CASE_INSESITIVE_ORDER) // 대소문자 구분 없이
string.sorted(Comparator.comparing(String::length)) // 길이 순 정렬

// 정렬 조건 추가
instanceStream.sorted(Comparator.comparing(Instance::getInstance)
					.thenComparing(Instance::getSum)
					.thenComparing(Instance::getName)
					.forEach(System.out::print);

변환

스트림 요소에 저장된 값 중에서 원하는 필드 추출, 또는 특정 형태로 변환해야 할 때
map() 사용

  • mapping? : 기존 값을 변경 x, 새로운 값을 생성해서 변환

// map()으로 Stream<File>을 Stream<String>으로 변환

Stream<File> fileStream = Stream.of(new File("Ex.java"), new File("Ex2.java"));
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println);
  • map 메서드 : 자기 자신 타입 스트림 반환

stream을 각 타입으로 변환시켜주는 메서드들 (자신 타입을 제외한 모든 스트림에서 동일하게 제공)

  • mapToInt
  • mapToLong
  • mapToDouble
  • mapToObj : 기본형 특화 스트림을 Stream으로 변환

정수를 문자열로 변환

public List<String> generateString(String readLine, int size) {
	return IntStream.range(0, size)
			.mapToObj( index -> readLine + index )
			.collect(Collectors.toList());
}

기본형 특화 스트림 : IntStream
mapToObj : IntStream을 일반 스트림으로 변환

profile
왔을때보다좋은곳으로

0개의 댓글