-
[Java] 스트림의 생성Java 2022. 1. 31. 00:01728x90
이전 시간에 스트림의 특징과 등장 배경에 대해서 알아보았습니다.
https://junuuu.tistory.com/78?category=968252
이제 스트림의 생성법을 알아보겠습니다
스트림은 아래와 같은 주기를 가집니다.
1. 스트림 생성
2. 중간 연산 (0~ n번)
3. 최종 연산 (0~1번)
Collection 인터페이스의 stream() 메서드로 컬렉션을 스트림으로 생성할 수 있습니다.
List<Integer> list = Arrays.asList(1, 2 ,3 ,4 ,5); Stream<Integer> intStream = list.stream(); //list를 스트림으로 변환 //스트림의 모든 요소를 출력(최종연산) intStream.forEach(System.out::print); //12345 intStream.forEach(System.out::print); //스트림은 최종연산을 1번만 진행할 수 있어서 에러가 발생
stream() 메서드를 통해 컬렉션을 스트림으로 생성했습니다.
또한 forEach() 최종 연산을 통해서 스트림의 요소를 출력해 보았습니다.
최종 연산을 2번 할 경우에는 스트림이 이미 닫혀서 에러가 발생합니다.
객체 배열로부터 스트림 생성할 수 있습니다.
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) Stream<String> strStream = Stream.of("a", "b", "c"); //가변인자로 인자를 마음대로 넣을 수 있다 Stream<String> strStream = Stream.of(new String[] {"a", "b" ,"c"}); Stream<String> strStream = Arrays.stream(new String[] {"a", "b" ,"c"}); Stream<String> strStream = Arrays.stream(new String[] {"a", "b" ,"c"}, 0 , 3);
Stream.of()를 활용하여 가변 인자를 넣거나 객체 배열을 통해 스트림을 생성할 수 있습니다.
Arrays.stream()을 활용하여 객체베 열을 인자로 넣고 시작점과 끝점을 넣어 스트림을 생성할 수 있습니다.
맨 마지막 코드의 0, 3은 배열의 0번째 index에서 2번째 index까지 스트림 요소로 생성함을 의미합니다.
기본형 배열로부터 스트림을 생성할 수 있습니다.
int[] intArr = {1, 2, 3 ,4 5}; IntStream intStream = Arrays.stream(intArr); System.out.println("average=" + intStream.average());
객체 배열로 생성하는 것과 유사하지만 Stream<> 대신에 IntStream을 사용합니다.
InsStream을 사용하게 되었을때 .average(), .sum(), .count()와 같은 다양한 메서드를 활용할 수 있습니다.
난수를 요소로 갖는 스트림을 생성할 수 있습니다.
IntStream intStream = new Random().ints(); //무한 스트림 intStream.limit(5).forEach(System.out::println); //5개의 요소만 출력한다. IntStream intStream = new Random().ints(5); //크기가 5인 난수 스트림을 반환
스트림은 무한 스트림와 유한 스트림이 있습니다.
무한 스트림은 limit()과 같이 자르는 메서드가 필요합니다.
만약 limit()을 사용하지 않는다면 난수가 무한하게 발생합니다.
특정 범위를 갖는 스트림을 생성할 수 있습니다.
IntStream intStream = IntStream.range(1, 5); // 1, 2, 3,4 IntStream intStream = IntStream.rangeClosed(1 ,5); // 1, 2, 3 ,4 5
람다식을 활용하여 스트림을 생성할 수 있습니다.
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f) static <T> Stream<T> generate<Supplier<T> s) Stream<Integer> evenStream = Stream.iterate(0, n -> n +2) ; //0, 2, 4, 6, .... Stream<Double> randomStream = Stream.generate(Math::random); Stream<Integer> oneStream = Stream.generate(() -> 1) ;
evenStream은 0부터 시작하여 짝수 값을 무한히 생성합니다.
0은 시작값(초기값) n -> n +2의 람다식은 2씩 증가함을 의미합니다.
randomStream을 랜덤 값 요소를 가지는 스트림 생성합니다.
oneStream을 결과가 항상 1인 스트림을 생성합니다.
둘 다 무한 스트림이기 때문에 limit()과 같은 자르는 연산이 필요합니다.
비어있는 스트림을 생성할 수 있습니다.
Stream emptyStream = Stream.empty(); long count = emptyStream.count();
출처
자바의 정석
https://www.youtube.com/watch?v=AOw4cCVUJC4&t=1014s
'Java' 카테고리의 다른 글
[Java] Math.max() vs 삼항연산자 (0) 2022.02.07 [Java] Comparator와 Comparable란? (0) 2022.02.03 [Java] 스트림(Stream)이란? + 특징, 등장배경 (0) 2022.01.29 [Java] 싱글톤(Singleton)이란? (0) 2022.01.27 [Java] 메서드 참조란? (0) 2022.01.25