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 스트림만들기
반응형