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 |