스트림을 생성하기 (컬렉션, 배열)

sion Jeong·2024년 7월 10일
0

빠른정리

💡 컬렉션 → 스트림 생성은 Collection 인터페이스의 stream()메서드로 생성

💡 객체 배열을 → 스트림으로 생성할땐 .of메서드나 Array의 .stream메서드 사용

💡 기본형 배열 → 스트림으로 만들기

  • IntStream 반환타입 사용
  • IntStream 반환타입 기본형 스트림은 인자가 숫자이기 때문에 -> 카운트 이외의 더하기 , 평균 구하기 등이 가능하다. (계산가능)

💡 난수를 요소로 갖는 스트림 생성

💡 특정 범위의 정수를 요소로 갖는 스트림 생성하기

  • range(1, 5) 메서드는 끝 포함X
  • rangeClosed(1, 5) 메서드는 끝을 포함

💡 람다식을 → 스트림으로 만드는 iterate(), generate()

스트림 만들기 (컬렉션, 배열)

List<Interger> list = Arrays.asList(1, 2, 3, 4, 5); //컬렉션

//컬렉션을 -> 스트림으로
Stream<Integer> intStream = list.stream(); 

//string 배열 -> 스트림으로
Stream<String> strStream = stream.of(new String[] {"a", "b", "c"}); 

//람다식 -> 스트림으로
Stream<Integer> evenStream = Stream.iterate(0, n -> n+2); // 0, 2, 4, 6 ...
Stream<Double> randomStream = Stream.generate(Math::random); 

//정수 -> 스트림으로
IntStream intStream = new Random().ints(5); //난수 스트림 (크기5)

스트림 생성과정

  1. 스트림 생성
  2. 중간연산(0~n번)
  3. 최종연산(0~1번)

1. 컬렉션으로부터 → 스트림 생성

💡 Collection 인터페이스의 → stream()메서드로 생성

  • 컬렉션데이터를 소스로 하는 → 스트림생성

예시

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Stream<Integer> intStream = list.stream(); //스트림 생성(컬렉션, 배열)
        intStream.forEach(System.out::print); //최종연산 -> 스트림 닫힘
        
        //Stream은 1회용이다., Stream에 대해 최종연산응 수행하면 -> 스트림이 닫힌다.
        intStream = list.stream(); //스트림이 닫혔으니 다시 생성
        intStream.forEach(System.out::print); // 12345 (최종연산)
    }
  • list의 컬렉션데이터를 소스로 하는→ 스트림을 생성
    .forEach = 최종연산
    따라서 forEach(최종연산)을 한번더 호출하면 → 이미 스트림은 닫혀있다 (스트림 다시 만들어서 써라)

2. 배열로부터 → 스트림 생성하기

💡 객체 배열을 → 스트림으로 생성할땐 .of메서드나 Array의 .stream메서드 사용

특징

  • 객체배열 스트림은 → 인자의 타입이 제네릭(일단 뭔지 알수없음)이기에 최종연산에서 카운트밖에 못센다.
// 가변 인자로 넣거가 (.of메서드 사용)
Stream<T> strStream = Stream.of(T...value)

//배열을 넣거나 (.of메서드 사용)
Stream<T> Stream.of(T[]) 

//배열을 넣거나 (Array의 .stream메서드 사용)
Stream<T> Arrats.stream(T[]) 

//배열의 일부만 스트림으로 만들기 (시작 ~ 끝포함안함)
Stream<T> Arrats.stream(T[] array, int statrInclusice, int endExclusice) 

예시

// 가변 인자로 넣거가 (.of메서드 사용)
Stream<String> strStream = Stream.of("a", "b", "c"); 

//배열을 넣거나 (.of메서드 사용)
Stream<String> strStream = Stream.of(new String[] {"a", "b", "c"}); 

//배열을 넣거나 (Array의 .stream메서드 사용)
Stream<T> strStream = Arrats.stream(new String[] {"a", "b", "c"});

//배열의 일부만 스트림으로 만들기 (시작 ~ 끝포함안함)
Stream<T> strStream = Arrats.stream(new String[] {"a", "b", "c"}, 0, 3);

💡 기본형 배열 → 스트림으로 만들기 (얘는 계산 가능)

  • IntStream 반환타입 사용해 만듬

특징

  • IntStream 반환타입 사용
  • IntStream 반환타입 기본형 스트림은 인자가 숫자이기 때문에 -> 카운트 이외의 더하기 , 평균 구하기 등이 가능하다. (계산가능)
  • Stream<T>객체 스트림은 → 인자의 타입이 뭔지 알수없으니 최종연산에 카운트밖에 못센다.
    예시 Stream<String>

실습

//객체 스트림 
Stream<String> strStream = Stream.of("a", "b", "c"); //String 가변인자 -> 스트림으로
strStream.forEach(System.out::println); //최종연산

Stream<String> strStream1 = Stream.of(new String[] {"a", "b", "c", "d"}); //String배열 Stream.of 사용 -> 스트림으로
strStream1.forEach(System.out::println);//최종연산

String[] strArray = {"a", "b", "c", "d"};
Stream<String> strStream2 = Stream.of(strArray); //String배열 Stream.of 사용 -> 스트림으로
strStream2.forEach(System.out::println);//최종연산

String[] strArray1 = {"a", "b", "c", "d"};
Stream<String> strStream3 = Arrays.stream(strArray1); //String배열 Arrays.stream사용 -> 스트림으로
strStream3.forEach(System.out::println);//최종연산

//예도 객체 스트림이라 -> 최종연산에서 카운트밖에 못센다.
Integer[] intArray1 = {1, 2, 3, 4, 5}; //new Integer {1, 2, 3, 4, 5} 안해도됨 -> 오토박싱
Stream<Integer> intStream1 = Arrays.stream(intArray1); //Integer배열 -> 스트림으로 (Arrays.stream사용)
intStream1.forEach(System.out::println);

// -----아래로 기본형 스트림

int[] intArray = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intArray); //Int 배열 -> 스트림으로 (Arrays.stream사용)
//intStream.forEach(System.out::println);//최종연산
System.out.println(intStream.sum()); //기본형 스트림은 숫자란걸 알아서 -> 카운트 이외의 더하기 , 평균 구하기 등이 가능하다.

3. 임의의수(난수)로 → 스트림 생성하기

💡 난수를 요소로 갖는 스트림 생성하기

  • 반환타입 IntStream에 + 랜덤 클래스에 ints(), longs(), doubles() 범위로 랜덤숫자를 뽑는 메서드사용
  • 랜럼클래스의 ints() 메서드 경우 범위가 무한인 난수이기 때문에 → 이것을 스트림으로 만들면 무한 스트림이 생성된다
    • 따라서 limit()로 스트림 생성 개수를 정해주거나
    • ints(5) 로 난수의 개수를 정해준다.
  • 맨 위처럼 스트림을 생성하면 → 5~9 까지의 랜덤숫자를 무한으로 생성하는 무한 스트림이 되는거고
  • streamSize를 정해주면 정해준 갯수만큼 스트림이 생성되는 유한 스트림으로 만들 수 있다.

예시

IntStream intStream = new Random().ints(); //난수 스트림 생성
intStream.limit(5).forEach(System.out::println); //5개의 난수를 생성

IntStream intStream2 = new Random().ints(); //난수 스트림 생성
intStream2.forEach(System.out::println); //크기 제한이 없기 때문에 -> 무한 스트림이 생성

//난수 스트림 생성 -> ints(5)메서드의 크기를 5로 제한
IntStream intStream3 = new Random().ints(5); 
intStream3.forEach(System.out::println); // 5개의 난수를 생성 (유한 스트림)

//범위주기 + 유한 스트림
IntStream intStream4 = new Random().ints(5, 10); //난수 스트림 생성 -> ints(5)메서드의 범위를 5~10까지로 설정(10은포함X)
intStream4.limit(10).forEach(System.out::println); // 10개의 난수를 생성 (5~9범위) (유한 스트림)

4. 특정 범위의 정수를 → 스트림으로 만들기

💡 특정 범위의 정수를 요소로 갖는 스트림 생성하기

  • range(1, 5) 메서드는 끝 포함X
  • rangeClosed(1, 5) 메서드는 끝을 포함

5. 람다식을 → 스트림으로 만드는 iterate(), generate()

람다식을 소스로 하는 → 스트림 생성하기 iterate(), generate() 사용

💡 iterate()는 이전 요소를 seed로 해서 다음 요소를 계산함 (무한 스트림)

Stream<Integer> evenStream = Stream.iterate(초기값, 람다식);

💡 generate() 는 seed를(초기값) 사용하지 않는다

  • 이전 결과하고 상관없음 → 독립적
Stream<Integer> evenStream = Stream.generate(() -> Math.random);
Stream<Integer> evenStream = Stream.generate(람다식); //1, 1, 1, 1, 1

실습해보기

//iterate를 사용한 람다식을 -> 스트림으로
Stream<Integer> intStream = Stream.iterate(0, n -> n + 2); //iterateㅊ(시드, 람다식)
intStream.limit(5).forEach(System.out::println); //리미트 안찍어주면 무한 스트림이 된다.
//generate를 사용한 람다식 -> 스트림으로
Stream<Integer> oneStream = Stream.generate(() -> 1); //generate(람다식)
oneStream.limit(5).forEach(System.out::println);
profile
개발응애입니다.

0개의 댓글