빠른정리
💡 컬렉션 → 스트림 생성은 Collection 인터페이스의
stream()메서드
로 생성
💡 객체 배열을 → 스트림으로 생성할땐
.of
메서드나 Array의.stream
메서드 사용
💡 기본형 배열 → 스트림으로 만들기
- IntStream 반환타입 사용
IntStream
반환타입 기본형 스트림은 인자가 숫자이기 때문에 -> 카운트 이외의 더하기 , 평균 구하기 등이 가능하다. (계산가능)
💡 난수를 요소로 갖는 스트림 생성
💡 특정 범위의 정수를 요소로 갖는 스트림 생성하기
range(1, 5)
메서드는 끝 포함XrangeClosed(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)
스트림 생성과정
💡 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 (최종연산)
}
forEach
= 최종연산forEach
(최종연산)을 한번더 호출하면 → 이미 스트림은 닫혀있다 (스트림 다시 만들어서 써라)💡 객체 배열을 → 스트림으로 생성할땐
.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()); //기본형 스트림은 숫자란걸 알아서 -> 카운트 이외의 더하기 , 평균 구하기 등이 가능하다.
💡 난수를 요소로 갖는 스트림 생성하기
- 반환타입
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범위) (유한 스트림)
💡 특정 범위의 정수를 요소로 갖는 스트림 생성하기
range(1, 5)
메서드는 끝 포함XrangeClosed(1, 5)
메서드는 끝을 포함람다식을 소스로 하는 → 스트림 생성하기
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);