티스토리 뷰

java_basic

Lambda 기초2 (스트림 생성하기)

✨✨✨✨✨✨✨ 2022. 2. 1. 21:57
반응형

[자바의 정석 - 기초편] ch 14~17~22 스트림 만들기

1. 컬렉션을 스트림으로 변환하기

Collection인터페이스의 stream()을 통하여 변환한다. 아래와 같이 Collection.java 안에는 stream메서드가 존재한다.

  • Stream<E> stream() // Collection인터페이스의 메서드

 

예제 Collection인 인터페이스의 stream을 사용하여 stream변환

List<Integer> list = Arrays.asList(1,2,3,4,5);
​
// list를 데이터소스로 하는 새로운 스트림을 생성한다.
Stream<Integer> intStream = list.stream();
intStream.forEach(System.out::print);
​
//stream has already been operated upon or closed
// stream은 일회성이기때문에 다시 생성하여 사용한다.
intStream = list.stream();
intStream.forEach(System.out::print);

 

2. 배열을 스트림으로 만들기

객체 배열로부터 스트림을 생성해보자

Stream<T> Stream.of(T... values); //가변인자
Stream<T> Stream.of(T[]);
Stream<T> Arrays.Stream(T[]);
​
//                                 시작인덱스,       갯수(마지막 count는 제외)
Stream<T> Arrays.Stream(T[] array, int startIndex, 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"});
​
// a, b만 출력
Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 2);

 

객체배열보다는 박싱, 언박싱을 안해도되는, 효율이 높은 기본형Stream인 IntStream을 사용해보자

IntStream IntStream.of(int... values);
IntStream IntStream.of(int[]);
IntStream Arrays.stream(int[]);
IntStream Arrays.stream(int[], int startIndex, int endExclusive);
IntStream intStream = IntStream.of(1,2,3,4,5);
IntStream intStream2 = IntStream.of(new int[]{1,2,3,4,5});
IntStream intStream3 = Arrays.stream(new int[]{1,2,3,4,5});
IntStream intStream4 = Arrays.stream(new int[]{1,2,3,4,5}, 0, 3);

 

Stream<T>같은 경우는 T가 어떤타입이 올 지 모르니, Integer일 경우 count 함수만 제공을 하지만, IntStream안에는 다양한 메서드들이 존재한다. 그렇기에 숫자를 Stream 으로 사용할 경우 IntStream을 사용하여 속도향상과 다양한 메서드를 이용해보자

System.out.println(intStream.sum());
System.out.println(intStream2.average());
System.out.println(intStream3.max());

 

3. 스트림의로 만들기 - 임의의 수

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

// 크기가 5인 난수 스트림
IntStream intStream = new Random().ints(5);

 

해당 메서드들은 new Ramdom()클래스의 난수 무한스트림을 생성한다.

Integer.MIN_VALUE <= ints() <= Integer.MAX_VALUE;
Long.MIN_VALUE <= longs() <= Long.MAX_VALUE;
0.0 <= doubles() <= 1.0;

 

나. 저정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메서드(Random 클래스)

// 무한 스트림
IntStream     ints(int begin, int end);
LongStream    longs(long begin, long end);
DoubleStream  doubles(double begin, double end);
​
// 유한스트림
IntStream     ints(long streamSize, int begin, int end);
LongStream    longs(long streamSize, long begin, long end);
DoubleStream  doubles(long streamSize, double begin, double end);

예제 : 난수의 범위를 지정해서 스트림 생성해보자

IntStream intStream = new Random().ints(5, 10);
intStream.limit(3).forEach(System.out::print);
​
IntStream intStream2 = new Random().ints(3, 5, 10);
intStream2.forEach(System.out::print);

 

다. 특정 범위의 정수를 요소로 갖는 스트림 생성하기(IntStream, LongStream)

IntStream intStream = IntStream.range(1, 5);  // 1,2,3,4
IntStream intStream2 = IntStream.rangeClosed(1, 5); // 1,2,3,4,5

 

4. 람다식으로 스트림 만들기

람다식을 소스로 하는 스트림 생성해보자

가. iterator()

사용법)

static <T> Stream<T> iterate(T seed, 단항연산자 람다식 f); // 이전 요소에 종속적

iterator()는 이전 요소를 seed로 해서 다음 요소를 계산한다.

예시)

Stream<Integer> intStream = Stream.iterate(0, n->n+2); //0, 2, 4, 6 ..

 

나. generate()

사용법)

static <T> Stream<T> generate(Supplier<T> s); // 이전 요소에 독립적

generate()는 seed를 사용하지않는다.

Supplier는 주기만 하고 매개변수X

예시)

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

 


참조 )

[자바의 정석 - 기초편] ch14-17~22 스트림만들기

https://www.youtube.com/watch?v=7Kyf4mMjbTQ

반응형

'java_basic' 카테고리의 다른 글

Lambda 기초5 최종연산 reduce  (0) 2022.02.16
Lambda 기초4 중간연산2  (0) 2022.02.16
Lambda 기초4 중간연산1  (2) 2022.02.14
Lambda 기초3 (스트림 중간연산/최종연산 전체 메소드)  (0) 2022.02.01
Lambda 기초1  (2) 2022.02.01
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함