JAVA4_07_스트림 만들기

charl hi·2021년 10월 8일
0

JAVA4

목록 보기
7/13

스트림 만들기 - 컬렉션

  • Collection 인터페이스의 stream()으로 컬렉션을 스트림으로 변환
  • 정확히는 변환이 아니라, 컬렉션을 데이터 소스로 하는 새로운 스트림을 생성
  • 따라서 List, Set도 stream()을 쓸 수 있다.

Stream<E> stream()



ex14_05_1

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

public class Ex14_05_1 {

	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);
//		intStream.forEach(System.out::print);	//에러:intStream closed
		//스트림은 일회용이고, forEach()는 최종연산이므로 닫힘!!
		//**다시 생성해야 한다!!!!
		intStream = list.stream();
		intStream.forEach(System.out::print);
		

	}

}

1234512345



스트림 만들기 - 배열

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

Stream.of()

Stream<T> Stream.of(T... values)

  • T...values : 가변인자

Stream<T> Stream.of(T[])

Arrays.stream(T[])

  • ✨✨Arrays클래스에도 stream()이 있다!!!

Stream<T> Arrays.stream(T[])

Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)

  • 배열의 일부를 스트림으로 생성할 때
  • 인덱스 : startInclusive ~ (endExclusive-1)



기본형 배열로부터 스트림 생성하기

  • ✨✨IntStream, LongStream, DoubleStream, ...

IntStream.of()

IntStream IntStream.of(int... values)

  • int... values : 가변인자

IntStream IntStream.of(int[])

Arrays.stream()

IntStream Arrays.stream(int[])

IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)



ex14_05_1

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

public class Ex14_05_1 {

	public static void main(String[] args) {

		//2. 배열을 스트림으로
		//1)Stream.of(가변인자)
		Stream<String> strStream = Stream.of("a","b","c");
		strStream.forEach(System.out::print);
		System.out.println();
		//2)Stream.of(T t)
		Stream<String> strStream2 = Stream.of(new String[] {"a","b","c"});
		strStream2.forEach(System.out::print);
		System.out.println();
		//위는 아래 두줄을 줄인 것 
		String[] strArr = {"a","b","c"};
		Stream<String> strStream3 = Stream.of(strArr);
		strStream3.forEach(System.out::print);
		System.out.println();
		//3)Arrays.stream(T[])
		Stream<String> strStream4 = Arrays.stream(strArr);
		strStream4.forEach(System.out::print);
		System.out.println();
		
		int[] intArr = {1,2,3,4,5};
		IntStream intStream2 = Arrays.stream(intArr);
//		intStream2.forEach(System.out::print);
//		System.out.println(intStream2.count());
//		System.out.println(intStream2.sum());
		System.out.println("average="+intStream2.average());	//다 최종연산이라 재생성 필수!!
		//Stream<Integer>로 하고 싶으면
		Integer[] intArr2 = {1,2,3,4,5};
		Stream<Integer> intStream3 = Arrays.stream(intArr2);
//		intStream3.forEach(System.out::print);
		System.out.println("count="+intStream3.count());	//이것밖에 없음!!!
	}

}

abc
abc
abc
abc
//12345
//count=5
//sum=15
average=OptionalDouble[3.0]
count=5



스트림 만들기 - 임의의 수(난수)

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

  • Random클래스의 메소드들 : ints(), longs(), doubles()
    -> 해당 범위에 있는 난수&무한(또는 유한) 스트림 생성

  • limit(숫자) : 무한 스트림이면 반드시 잘라야 한다. 제한을 안두면 끝도 없이 나옴


ex14_05_2

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

public class Ex14_05_2 {

	public static void main(String[] args) {
		IntStream intStream = new Random().ints();	//무한스트림
		intStream.limit(5).forEach(System.out::println);	//limit()필수!!
		
		IntStream intStream3 = new Random().ints(3, 10);	//3~9
		intStream3.limit(5).forEach(System.out::println);	//limit()필수!!
		
		IntStream intStream2 = new Random().ints(5);//유한스트림
		intStream2.forEach(System.out::println);
		
		IntStream intStream4 = new Random().ints(5, 3, 10);	//3~9
		intStream4.forEach(System.out::println);

	}

}

-468109592
631298685
265823285
-819366561
-2089176965
5
9
4
9
7
1824864387
382440383
-1628628531
-1553195391
-1332646964
9
7
3
5
3



스트림 만들기 - 특정 범위의 정수

  • 특정 범위의 정수를 요소로 갖는 스트림 생성하기
  • IntStream, LongStream
IntStream IntStream.range(int begin, int end)	//begin ~ end-1
IntStream IntStream.rangeClosed(int begin, int end)	//begin ~ end포함!!

예)

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



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

링크텍스트

  • 람다식을 소스로 하는 무한스트림 생성하기
  • 람다식을 매개변수로 받아 무한스트림을 만드는 메소드

iterate()

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

  • T seed : 초깃값
  • UnaryOperator<T> f : 단항 연산자 람다식
  • 이전 요소에 종속적 : 이전 요소를 seed로 해서 다음 요소를 계산한다.
  • ✨이렇게 생성된 스트림을 기본형 스트림 타입(IntStream..)의 참조변수로 다룰 수 없다.

예)

Stream<Integer> evenStream = Stream.iterate(0, n->n+2);
//0, 2, 4, 6, ... 무한!!!

generate()

static <T> Stream<T> generate(Supplier<T> s)

  • Supplier<T> s : 입력X, 출력O 람다식
  • 매개변수가 없는 람다식!!
  • 이전 요소에 독립적 : seed를 사용하지 않는다.
  • ✨이렇게 생성된 스트림을 기본형 스트림 타입(IntStream..)의 참조변수로 다룰 수 없다.

예)

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


ex14_05_3

import java.util.stream.Stream;

public class Ex14_05_3 {

	public static void main(String[] args) {
		// 람다식 스트림 만들기
		//iterate(T seed, UnaryOperator f) 단항연산자
		Stream<Integer> intStream = Stream.iterate(0, n -> n + 2);
		intStream.limit(5).forEach(System.out::println);

		//generate(Supplier s) 입력X 출력O
		Stream<Integer> oneStream = Stream.generate(() -> 1);
		oneStream.limit(5).forEach(System.out::println);

	}

}

0
2
4
6
8
1
1
1
1
1



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

파일과 스트림

  • 파일을 소스로 하는 스트림 생성하기

  • 지정된 폴더 안의 파일들로 이루어진 스트림으로 만들기

  • 파일의 내용을 라인 단위로 읽어 요소로 하는 Stream<String>으로 만듦

빈 스트림

  • 비어있는 스트림 생성하기
Stream emptyStream = Stream.empty();
long count = emptyStream.count();	//count = 0
  • empty() : 빈 스트림을 생성해서 반환



Ref

0개의 댓글