14-17~22 스트림 만들기

oyeon·2021년 3월 22일
0

Java 개념

목록 보기
66/70

스트림 만들기 - 컬렉션

  • Collection 인터페이스의 stream()으로 컬렉션을 스트림으로 변환
Steram<E> stream()	//	Collection 인터페이스의 메서드
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

// list를 데이터 소스로 하는 새로운 스트림을 생성
Stream<Integer> intStream = list.stream();	

// 스트림의 모든 요소를 출력
// 메서드 참조를 람다식으로 바꾸면 (i) -> System.out.print(i)
intStream.forEach(System.out::print);	// 12345

// forEach는 최종연산이므로 위에서 이미 수행되었기 때문에 stream이 닫혔다.
intStream.forEach(System.out::print);	// 에러. 스트림이 이미 닫혔다.

스트림 만들기 - 배열

  • 객체 배열로부터 스트림 생성하기
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<T> strStream = Stream.of("a", "b", "c"); // 가변 인자
Stream<T> strStream = Stream.of(new String[]{"a", "b", "c"});
Stream<T> strStream = Arrays.stream(new String[]{"a", "b", "c"});
Stream<T> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 3);
  • 기본형 배열로부터 스트림 생성하기
IntStream IntStream.of(int... values)	// Stream이 아니라 IntStream
IntStream IntStream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int startInclusive, int endExclusive)
// 기본형 스트림(이 방법이 더 좋다. int형 메서드 지원)
int[] intArr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intArr);
intStream.forEach(System.out::println);
System.out.println(intStream.count()) // OK. 최종 연산
System.out.println(intStream.sum()) // OK. 최종 연산
System.out.println(intStream.average()) // OK. 최종 연산

// Integer 객체 스트림
// Stream<T>는 숫자외에도 여러 타입의 스트림이 가능해야 하므로 int형 스트림에만
// 사용할 수 있는 sum(), average()가 없다.
Integer[] intArr = {1, 2, 3, 4, 5};	// int[] 불가능
Stream<Integer> intStream = Arrays.stream(intArr);
intStream.forEach(System.out::println);
System.out.println(intStream.count()) // OK. 최종 연산
System.out.println(intStream.sum()) // 에러. sum() 메서드 지원 X

스트림 만들기 - 임의의 수

  • 난수를 요소로 갖는 스트림 생성하기
// 무한스트림은 limit같은 것으로 범위를 정해줘야 한다.
IntStreamintStream = new Random().ints();	 // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 5개의 요소만 출력한다.

// 처음부터 stream 크기를 정할수도 있다.
IntStream intStream = new Random().ints(5);  // 크기가 5인 난수 스트림 반환
// 범위가 무한대이다.
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, LongStream)
IntStream intStream.range(int begin, int end)
IntStream intStream.rangeClosed(int begin, int end)
IntStream intStream.range(1, 5);	// 1, 2, 3, 4
IntStream intStream.rangeClosed(1, 5)	// 1, 2, 3, 4, 5

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

  • 람다식을 소스로 하는 스트림 생성하기
// UnaryOperator : 단항 연산자 - 입력값 1개, 출력값 1개
// 이전 요소에 종속적(무한 스트림)
static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

// 이전 요소에 독립적(무한 스트림)
static <T> Stream<T> generate(Supplier<T> s) 
  • iterate()는 이전 요소를 seed로 해서 다음 요소를 계산한다.
// 0, 2, 4, 6, ... (무한 스트림)
Stream<Integer> evenStream = Stream.iterate(0, n -> n + 2);
  • generate()는 seed를 사용하지 않는다.
// () -> Math.random() (무한 스트림)
Stream<Double> randomStream = Stream.generate(Math::random);

// 1, 1, 1, 1, 1, 1 ....(무한 스트림)
Stream<Integer> oneStream = Stream.generate(() -> 1);

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

(참고)

  • 파일을 소스로 하는 스트림 생성하기
Stream<Path> Files.list(Path dir)	// Path는 파일 또는 디렉토리
// 파일 내용을 라인 단위로 읽어서 Stream으로 만든다.
Stream<String> Files.lines(Path, path)
Stream<String> Files.lines(Path, path, Charset cs)

Stream<String> lines() // BufferedReader 클래스의 메서드
  • 비어있는 스트림 생성하기
Stream emptyStream = Stream.empty(); // empty()는 빈 스트림을 생성해서 반환
long count = emptyStream.count(); // count의 값은 0
profile
Enjoy to study

0개의 댓글