본문 바로가기

하../java

ch14 스트림 만들기

스트림 만들기 - 컬렉션

  1. 스트림 생성
  2. 중간 연산(0~n개)
  3. 최종연산(0~1개)

Collection인터페이스의 stream()으로 컬렉션을 스트림으로 변환

List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> intStream - list.stream(); - list를 스트림으로 변환

스트림의 모든 요소 출력
intStream.forEach(System.out::print); - 12345
intStream.forEach(System.out::print); - 에러 forEach는 최종 연산 스트림은 이미 종료됨

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

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) - 배열의 범위 from ~ to

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 Stream.of(T...values) - 가변 인자
IntStream Stream.of(T[])
IntStream Arrays.stream(T[])
IntStream Arrays.stream(T[] arrays, int startInclusive, int endExclusive)
   String[] strArr = new String[] {"a","b","c"};
   Stream<String> strStream = Stream.of(strArr);
   strStream.forEach(System.out::println);

== 위 1,2,줄을 아래 한줄로
   Stream<String> strStream = Stream.of(new String[] {"a","b","c"});
   strStream.forEach(System.out::println);
		
   int[] intArr = {1,2,3,4,5}; //기본형 스트림
   IntStream intStream = Arrays.stream(intArr); 
   - intStream은 sum,average등 다양한 메소드 사용가능 숫자인걸 알기때문
   intStream.forEach(System.out::println); - 최종 연산이기 때문에 한번만 사용 가능
   System.out.println("sum=" + intStream.sum());  - 최종 연산이기 때문에 한번만 사용 가능
   System.out.println("average=" + intStream.average()); - 최종 연산이기 때문에 한번만 사용 가능
		
   Integer[] intArr = {1,2,3,4,5}; //객체형 스트림
   - 객체형 스트림은 숫자가 아닐수도 있으니 count만 사용 가능
   Stream<Integer> intStream = Arrays.stream(intArr);
   intStream.forEach(System.out::println);

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

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

IntStreamintStream = new Random().ints(); - ints()는 무한 스트림을 생성
intStream.limit(5).forEach(System.out::println); - 5개의 요소만 출력한다

IntStream intStream = new Random().ints(5) - 크기가 5인 난수 스트림을 반환
Random()클래스 메서드
Integer.MIN_VALUE <= ints() <= Integer.MAX_VALUE 
LONG.MINVALUE <= longs() <= Long.MAX_VALUE
0.0 <- double() <1.0

지정된 범위의 난수를 요소로 갖는 스트림을 생성하는 메소드(Random클래스)

무한 스트림
IntStream ints(int begin, int end) - from ~ to
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 double(long streamSize, double begin, double end)
IntStream intStream = new Random().ints(); - 무한스트림
intStream.limit(5).forEach(System.out::println); -5개만 잘라서 출력 limit이 없을경우 무한으로 출력
결과값
-670408348
2055506580
225461681
-1665076924
-823254044

 

IntStream intStream = new Random().ints(5); //5개 개수를 지정
intStream.forEach(System.out::println);
-670408348
2055506580
225461681
-1665076924
-823254044
IntStream intStream = new Random().ints(5, 10); - 5부터 9까지 범위를
intStream.limit(5).forEach(System.out::println); - 5개만 잘라서 출력
출력값
6
7
9
7
5

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

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

IntStream intStream = 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)  
T seed(초기값) UnaryOperator<T> f(람다식)

static <T> Stream<T> generate(Supplier<T> s)
Supplier<T> s(람다식)

초기값 0부터 +2 +2 +2 ...

 

무한 스트림

iterate(T seed, UnaryOperator f) - 단항 연산자 하나의 값을 넣으면 결과가 하나 나오는것
Stream<Integer> intStream = Stream.iterate(0, n->n+2); - 초기값 0부터 시작하는 무한루프
intStream.limit(10).forEach(System.out::println); - 10개만 자름
출력값
0
2
4
6
8
10
12
14
16
18
generate(Supplier s) : 주기만 하는것 입력이 없고 출력만 한다 
Stream<Integer> oneStream = Stream.generate(()-> 1); - 무한 스트림
oneStream.limit(10).forEach(System.out::println); - 10개만 잘라서 출력
출력값
1만 10개 출력됨

파일과 빈 스트림

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

Stream<Path> Files.list(Path dir) - Path는 파일 또는 디렉토리
Path dir(폴더)

Stream<String> Files.lines(Path path)
Stream<String> FIles.lines(Path path, Charset cs)
Stream<String> lines() - BufferedReader클래스의 메소드
lines()는 파일 내용을 라인 단위로 읽어서 String으로 만들어 Stream<String>으로 만듬
파일의 내용을 한줄 한줄 읽음 Text파일 읽을때 편함

비어있는 스트림 생성하기

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

'하.. > java' 카테고리의 다른 글

ch14 스트림의 중간연산  (0) 2021.12.26
ch14 스트림의 연산  (0) 2021.12.26
ch14 스트림 스트림의 특징  (0) 2021.12.26
ch14 Predicate의 결합 CF와 함수형 인터페이스  (0) 2021.12.26
ch14 java.util.function 패키지  (0) 2021.12.25