스트림 만들기
스트림 만들기 - 컬렉션
1. 스트림 생성.
2. 중간 연산(0~n번)
3. 최종 연산 (0~1번)
- Collection 인터페이스의 stream() 으로 컬렉션을 스트림으로 변환
Collection 인터페이스에 stream() 이라는 메서드가 있는데, stream()은 컬렉션을 스트림으로 만들어서 반환해준다.
Collection 인터페이스의 자손인 List와 Set 두 인터페이스를 구현한 Collection 클래스가 stream() 메서드를 가지고 있다
1, 2, 3, 4, 5가 저장되어 있는 list가 있을 때, 해당 list 에다가 .stream() 만 호출하면 스트림을 얻을 수 있다.
그리고 해당 stream으로부터 모든 요소를 출력하려면 forEach()를 사용하면 된다.
그 안에 System.out::print 를 해주면 되는데, 이것은 메서드 참조인데, 이것을 람다식으로 바꿀 수 있었다. (i) -> System.out.print(i)
앞으로 System.out::print 같은 메서드 참조를 많이 사용할 것이다.
최종연산은 0번 또는 1번만 호출 가능하다. 그래서 앞의 연산에서 해당 스트림에 대해서 forEach를 호출했기 때문에 stream이 닫힌다.
그래서 한번 더 수행하니까 에러가 나는 것이다.
스트림 만들기 - 배열
- 객체 배열로부터 스트림 생성하기
Stream 클래스에 .of() 라는 메서드가 잇는데, ()에는 가변인자를 넣으면 된다. 배열을 넣어도 된다.
Arrays클래스에는 .stream()이라는 메서드가 있다. ()배열의 범위를 넣어줄 수 있다. 즉, 배열의 일부로만 스트림을 만들 수 있는 것이다. 배열의 요소 인덱스로 from~to 이고, to는 포함되지 않는다.
- 기본형 배열로부터 스트림 생성하기
기본형 배열로 스트림 만들 때는 만들어진 스트림이 IntStream 이다.
()에는 가변인자를 넣거나, 기본형 배열을 넣으면 된다.
스트림 만들기 - 임의의 수
- 난수를 요소로 갖는 스트림 생성하기
ints(), longs(), doubles() 메서드들이 있는데, 이 메서드 들은, Random클래스에 정의되어 있는 것들이다.
각 타입의 범위안에 속하는 난수들을 요소로 갖는 무한 스트림을 생성한다.
스트림에는 유한스트림, 무한스트림 이렇게 두가지가 있는데,
난수 스트림을 반환하는 ints(), longs(), doulbes() 메서드들은 무한스트림을 생성한다.
그래서 무한 스트림은 limit() 같은 것으로 잘라줘야 한다.
아니면, 처음부터 .ints(5) 이런식으로 스트림 크기를 지정해 줄 수 있다.
혹은, 난수의 범위를 지정해주는 메서드들도 있다.
위에서 살펴봤던 ints()의 경우에는 범위가 Integer최솟값, Integer최댓값 사이의 범위였다
그런데, ints(5, 10) 이렇게 해주면, from to 가 적용되어 5이상 10미만의 범위가 적용된다. 이것도 무한스트림인 것은 마찬가지다.
유한스트림으로 만들 수도 있는데, ints()에 sreamsize를 주면 된다. 그러면 유한 스트림을 얻을 수 있다.
스트림 만들기 - 특정 범위의 정수
- 특정 범위의 정수를 요소로 갖는 스트림 생성하기(IntStream, LongStream)
IntStream.range(1, 5); 를 하면 from to가 적용되어 1, 2, 3, 4 만 범위가 된다.
IntStream.rangeClosed(1, 5); 를 하면, 끝이 포함되어 1, 2, 3, 4, 5가 범위가 된다.
스트림 만들기 - 람다식 iterate(), generate()
- 람다식을 소스로 하는 스트림 생성하기
iterate()와 generate() 메서드에 람다식을 주면, 이 람다식을 이용해서 계속 스트림을 만들어낸다. 무한 스트림이다. 그래서 limit() 같은 것으로 잘라줘야 한다.
- iterate()는 이전 요소를 seed로 해서 다음 요소를 계산한다.
초기값이 0으로 설정하면 n 초기값이 0이되어, 0 + 2 하면 2, 그리고 결과 2가 다시 쓰여서 초기값이 되는 것이다.
- generate()는 seed를 사용하지 않는다.
generate()는 seed를 쓰지 않는다. 람다식만 넣는다.
Stream<Double> randomStream = Stream.generate(Math::random); 에서 Math::random이 메서드 참조인데,
이것을 람다식으로 바꾸려면 () -> Math.random(); 이렇게 뭔가 입력이 있고, 그 뒤에 메서드가 있어야 한다.
해당 Math::random 값을 계속 생성해 내는 것이 무한 스트림 값이다.
Stream.generate(()->1); 은 계속 1, 1, 1, 1, 이렇게 1이 나오는 것이다.
interate()는 초기값을 가지고, 이전값들과 관련이 있는데,
generate()는 seed(초기값)을 사용하지 않는다. 그리고 이전결과와 관계가 없다. 각 요소가 서로 독립적이다
스트림 만들기 - 파일과 빈 스트림
- 파일을 소스로 하는 스트림 생성하기
폴더경로를 주게 되면, 지정된 폴더안에 있는 파일들로 이루어진 stream을 생성할 수 있다.
그리고 더 자주쓰일만한 것은, .lines() 메서드인데, 파일 내용을 라인단위로 읽어서 String으로 만들고,
Stream<String>으로 만든다. 이것은 로그파일 분석같은 경우나 다량의 텍스트파일을 처리할 때 유용하다.
그리고 lines() BufferedReader 클래스에도 있는데, BufferedReader 클래스는 텍스트 파일을 읽을 때 편리한 클래스다.
15장에서 살펴볼 예정이다.
- 비어있는 스트림 생성하기
비어있는 스트림도 만들 수 있는데,
.empty() 라는 메서드를 사용하면 비어있는 스트림을 얻을 수 있다.
비어있으므로 .count() 는 0이다.
'JAVA' 카테고리의 다른 글
스트림의 중간연산(1) (0) | 2022.11.19 |
---|---|
스트림의 연산 (0) | 2022.11.16 |
스트림, 스트림의 특징 (0) | 2022.11.14 |
메서드 참조, 생성자의 메서드 참조 (0) | 2022.08.05 |
Predicate의 결합, 컬렉션 프레임웍과 함수형 인터페이스 (0) | 2022.08.04 |
댓글
이 글 공유하기
다른 글
-
스트림의 중간연산(1)
스트림의 중간연산(1)
2022.11.19 -
스트림의 연산
스트림의 연산
2022.11.16 -
스트림, 스트림의 특징
스트림, 스트림의 특징
2022.11.14 -
메서드 참조, 생성자의 메서드 참조
메서드 참조, 생성자의 메서드 참조
2022.08.05