Java/객체지향

[객체지향][스트림/Stream] - 스트림 만들기

얄루몬 2022. 3. 15. 22:34

https://youtu.be/AOw4cCVUJC4?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp 

📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.


[스트림 만들기 - 컬렉션]

컬렉션으로부터 스트림을 만드는 방법을 알아보자.

  • Collection인터페이스의 stream()으로 컬렉션을 스트림으로 변환
package javajungsuk;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class Java14_7 {

	public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1,2,3,4,5);
		Stream<Integer> intStream = list.stream(); //list를 Stream으로 변환
		intStream.forEach(System.out::print); //forEach는 최종연산으로 스트림이 닫혀서 아래와 같이 해줘야 한다.
		
			
		intStream = list.stream(); //list로부터 stream 생성
		intStream.forEach(System.out::print);

	}

}

[스트림 만들기 - 배열]

  • 객체 배열로부터 스트림 생성하기

[문자형 배열인 경우]

package javajungsuk;

import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		
		Stream<String> strStream = Stream.of(new String[] {"a","b","c","d"});
		strStream.forEach(System.out::println);
	}
}
package javajungsuk;

import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		String[] strArr = {"a","b","c","d"};
		Stream<String> strStream = Stream.of(strArr);
		strStream.forEach(System.out::println);
	}
}
package javajungsuk;

import java.util.Arrays;
import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		String[] strArr = {"a","b","c","d"};
		Stream<String> strStream = Arrays.stream(strArr);
		strStream.forEach(System.out::println);
	}
}

[int형 배열일 경우]

package javajungsuk;

import java.util.Arrays;
import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		Integer[] intArr = {1,2,3,4,5};
		Stream<Integer> intStream = Arrays.stream(intArr);
		intStream.forEach(System.out::println);
	}
}
package javajungsuk;

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		int[] intArr = {1,2,3,4,5};
		IntStream intStream = Arrays.stream(intArr);
		intStream.forEach(System.out::println);
    }
}

[기본 스트림이 추가로 제공하는 것]

package javajungsuk;

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Java14_8 {
	public static void main(String[] args) {
		int[] intArr = {1,2,3,4,5};
		IntStream intStream = Arrays.stream(intArr);
		//intStream.forEach(System.out::println);
		//System.out.println("count = "+ intStream.count());
		//System.out.println("sum = "+ intStream.sum());
		//System.out.println("average = "+ intStream.average());
	}

}
  • 기본 스트림의 경우 sum과 average를 사용할 수 있는 이유는 int로 숫자라는 것을 알기 때문이다. 그러나 객체형의 경우엔 데이터타입이 무엇을 의미하는지 모르기 때문에 이때는 sum, average같은 메소드는 제공하지 않고 count는 제공한다. (count는 몇개인지 세면 되니까 가능하다.)

[스트림 만들기 - 임의의 수]

  • 난수를 요소로 갖는 스트림 생성하기
    • 지정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메서드(Random 클래스)
package javajungsuk;

import java.util.Random;
import java.util.stream.IntStream;

public class Java14_9 {
	public static void main(String[] args) {
		IntStream intStream = new ints();
		intStream
			.limit(5)
			.forEach(System.out::println);	
	}
}
package javajungsuk;

import java.util.Random;
import java.util.stream.IntStream;

public class Java14_9 {
	public static void main(String[] args) {
		IntStream intStream = new ints(5);
		intStream
			.forEach(System.out::println);	
	}
}
  • 특정 범위의 정수를 요소로 갖는 스트림 생성하기(IntStream, LongStream)

[스트림 만들기 - 람다식 iterate(), generate()]

  • 람다식을 소스로 하는 스트림 생성하기
  • iterate()는 이전 요소를 seed로 해서 다음 요소를 계산한다.
    • 이전 요소에 종속적이다.
  • generate()는 seed를 사용하지 않는다.
    • 이전 요소에 독립적이다.
package javajungsuk;

import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class Java14_9 {
	public static void main(String[] args) {
		
		//iterate(T seed, UnaryOperator f) 당항 연산자
		Stream<Integer> intStream = Stream.iterate(0, n->n+2);
		intStream.limit(10).forEach(System.out::println);
		
		
		//generate : 주기만하는 것 입력X, 출력 O
		Stream<Integer> oneStream = Stream.generate(()->1);
		oneStream
			.limit(10)
			.forEach(System.out::println);
	}
}

[스트림 만들기 - 파일과 빈 스트림]

  • 파일을 소스로 하는 스트림 생성하기
    • 지정된 폴더 안에 파일들을 손쉽게 관리할 수 있다.
  • 비어있는 스트림 생성할 수도 있다.
  • 자주 쓰이지 않아 그냥 있다고만 알면 됨.