Java/공부

자바 스트림 만들기

pakms980319 2024. 12. 9. 16:04

https://www.youtube.com/watch?v=AOw4cCVUJC4&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=164

 

[깃허브 저장소]

https://github.com/pakms980319/JavaStudy-2024-12-09

 

GitHub - pakms980319/JavaStudy-2024-12-09

Contribute to pakms980319/JavaStudy-2024-12-09 development by creating an account on GitHub.

github.com

 

 

스트림 만들기

 

스트림 만들기 - 컬렉션

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

 

스트림의 모든 요소 출력

intStream.forEach(System.out::print);  // forEach() 최종연산
// intStream.forEach(System.out::print);  // 에러, 이미 스트림이 닫혔다.

 

스트림은 1회용, stream 에 대해 최종 연산을 수행하면 stream 이 닫힌다.

 

다시 스트림을 사용하고 싶다면 새로 stream 을 만들면 된다.

intStream = list.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[] arrays, int startInclusive, int endExclusive) - 배열의 일부만 스트림으로 생성 ( startInclusive : 시작, endExclusive : 끝 , [start, end-1] )
* 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);

 

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

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

 

예제 코드

Stream<String> strStream = Stream.of("a", "b", "c");
Stream<String> strStream2 = Stream.of(new String[]{"a", "b", "c"});
Stream<String> strStream3 = Arrays.stream(new String[] {"a", "b", "c"});

 

int[] intArr = {1, 2, 3, 4, 5};
IntStream intStream = Arrays.stream(intArr);
intStream.forEach(System.out::println);

intStream = Arrays.stream(intArr);
System.out.println("sum=" + intStream.sum());

intStream = Arrays.stream(intArr);
System.out.println("average=" + intStream.average());
  • IntStream 을 사용함으로써 sum(), average() 와 같은 다양한 메서드를 사용할 수 있다.
  • 최종 연산을 하면 기존의 stream 을 다시 사용하지 못하기 때문에 중간에 새로운 stream 을 만들어주었다.
Integer[] intArr = {1, 2, 3, 4, 5};
Stream<Integer> intStream = Arrays.stream(intArr);  // 오토박싱
intStream.forEach(System.out::println);

intStream = Arrays.stream(intArr);
System.out.println("count=" + intStream.count());
  • 기본형 Stream 을 사용하지 않고 Stream<Integer> 를 사용할 시 오토박싱&언박싱 과정이 생길 수 있어 성능 문제가 생길 수 있다.
  • 연산 메서드 중에서 IntStream 과 같이 여러 메서드를 사용하지 못하고 Stream 의 개수를 세는 count() 만 사용할 수 있다.

 


스트림 만들기 - 임의의 수 

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

* IntStream intStream = new Random().ints();  // 무한 스트림
* intStream.limit(5).forEach(System.out::println);  // 5개의 요소만 출력한다.
* 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 intStream = new Random().ints();  // 무한 난수 스트림
intStream
        .limit(5)
        .forEach(System.out::println);  // limit 를 설정해주지 않는다면 무한 반복한다.
IntStream intStream1 = new Random().ints(5);  // 개수 지정
intStream1.forEach(System.out::println);
IntStream intStream2 = new Random().ints(5, 10); // 5 ~ 10 범위 지정
intStream2
        .limit(10)
        .forEach(System.out::println);
IntStream intStream3 = new Random().ints(10, 5, 10);  // 10개의 난수, 5 ~ 10 사이
intStream3
        .limit(10)
        .forEach(System.out::println);

 


 

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

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

* IntStream IntStream.range(int begin, int end)
* IntStream IntStream.rangeClosed(int begin, int end)

 

예시

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

 


 

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

람다식을 소스로 하는 스트림 생성하기

* static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)  // 이전 요소에 종속적, seed 는 초기값
* static <T> Stream<T> generate(Supplier<T> s)  // 이전 요소에 독립적

 

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

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

 

generate() - seed 를 사용하지 않아 이전 요소에 독립적이다.

* Stream<Integer> oneStream = Stream.generate(()->1);

 

예시

Stream<Integer> intStream = Stream.iterate(0, n -> n + 2);
intStream.limit(10).forEach(System.out::println);  // 짝수 스트림
intStream = Stream.iterate(1, n -> n + 2);
intStream.limit(10).forEach(System.out::println);  // 홀수 스트림
Stream<Integer> oneStream = Stream.generate(() -> 1);
oneStream.limit(10).forEach(System.out::println);

 


 

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

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

Stream<Path> Files.list(Path dir)  // Path 는 파일 또는 디렉토리
* Stream<String> Files.lines(Path path)  // line 단위로 읽어 Stream<String> 으로 만든다
* Stream<String> Files.lines(Path path, Charset cs)
* Stream<String> lines()  // BufferedReader 클래스의 메서드

 

비어있는 스트림 생성하기

* Stream emptyStream = Stream.empty();  // empty() 는 빈 스트림을 생성해서 반환한다.
* long count = emptyStream.count();  // count 의 값은 0

'Java > 공부' 카테고리의 다른 글

자바 스트림의 중간연산(1)  (1) 2024.12.09
자바 스트림의 연산  (0) 2024.12.09
자바 스트림(Stream), 스트림의 특징  (0) 2024.12.09
0. 예외 처리  (0) 2024.03.13
0. Wrapper 클래스  (0) 2024.03.13