스트림 part1

Shaun·2021년 9월 12일
1

JAVA

목록 보기
24/30

스트림

  • 지금까지 수많은 데이터들을 컬렉션이나 배열에 담고 for문을 돌리거나 iteraotr을 사용하는 코드를 작성했다. 이러한 방법은 머구 길고 알아보기 힘들다

  • 데이터 소스가 무엇이던 간에 같은 방식으로 다뤄 코드의 재사용성을 높이는 스트림 을 배워보자

  • 스트림을 사용하면 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰수 있다.

  • 스트림은 데이터 소스를 변경하지 않고 읽기만한다. 스트림은 일회용 이다.

  • 스트림은 내부반복 처리를 한다.

스트림의 연산

1.중간연산 = 연산 결과가 스트림인 연산. 스트림에 연속해서 중간연산 가능
2.최종연산= 연산 결과가 스트림이 아닌 연산. 스트림의 요소를 소모하므로 한번만 가능.

지연된 연산

  • 스트림 연산에서 중간 연산을 호출해도 즉가적인 연산이 되는게 아니다. 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다는 것이다.

  • 중간 연산을 호출 하는것은 어떤 작업이 수행되어야 하는지를 지정해주는 것
    뿐.

Stream<Integer> 와 intStream

  • 오토박싱, 언박싱으로 인한 비효율을 줄이기 위해 데이터 소스의 요소를 기본형으로 다루는 스트림, IntStream, LongStream, DoubleStream

스트림 만들기

컬렉션 ->스트림

  • Collection에 stream()이 정의되어 있다. ->List, set 사용 가능

Stream<T> aaa= Collection.stream()

-> List<Integer>list = Arrays.asList(1,2,3,4,5)
-> Stream<Integer> intStream =list.stream();
->intStream.forEach(System.out::println) //출력 // 최종연산
->intStream.forEach(System.out::println) //에러// 스트림 닫힘

  • forEach()스트림 요소를 소모하면서 작업을 수행하므로 같은 스트림에 forEach()를 두번 호출 할수 없다.
  • foreach()는 for문을 내부적으로 포함 한다.

배열 ->스트림

Stream<T> Stream.of(T...value)
Stream<T> Stream.of(T[])
-> Stream<String> - stream.of("a","b","c","d")
-> Stream<String> - stream.of(new String("a","b","c","d")

Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int startInclusive, int endExclusive)
->Stream<String> - Arrays.stream(new String[]{"a","b"})
->Stream<String> - Arrays.stream(new String[]{"a","b"},0,3)

int,long,double 같은 기본형 배열을 소스로 하는 스트림을 생성하는 메서드도 있다.

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

특정 범위의 정수

  • 지정된 범위의 연속된 정수를 스트림으로 생성해서 반환한다.

IntStream IntStream.range(int begin, int end)
IntStream IntStream.rangeClosed(int begin, int end)
(range= end범위 포함x, rangeClosed= 포함 ㅇ)

임의의 수

IntStream ints()
LongStream longs()
DoubleStream dobles()

  • 이 메서드들은 해당타입의 난수들로 이루어진 스트림 반환

  • 이 메서드들이 반환하는 스트림은 크기가 정해지지 않은 무한 스트림이므로 limit()도 같이 사용해서 스트림을 재한 해 줘야한다.

ex)
IntStream intStream=new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println);//5개의 요소만 출력

임의의 수 2

IntStream ints(long streamSize)
LongStream longs(long streamSize)
DoubleStream dobles(long streamSize)

  • 매개변수로 스트림의 크기를 지정해서 '유한 스트림' 으로 생성해서 limit()필요없다.

지정된 범위 임의의수 만들기

  • end범위 포함 x
    IntStream ints(int begin, int end)
    LongStream longs(long begin, long end)
    DoubleStream dobles(double begin, double end)

람다식(iterate() , generate() )

  • 이 메서드들은 람다식을 매개변수로 받아 무한스트림 생성

  • 이 메서드들은 기본형 스트림 타입의 참조변수를 다룰수 없다.

static <T> Stream<T> iterate(T seed, unaryOperator<T> f)
static <T> Stream<T> generate(Supplier<T.> s)

iterate()

ex)
Stream<Integer.>evenStream= Stream.iterate(0,n->n+2);

generate()

  • iterate()와 달리 이전 결과를 이용해서 다음 요소를 계산하지 않는
    .
  • 매개변수가 없는 람다식만 허용(=supplier)

ex)
Stream<Double.> raandomStream= Stream.generate(Math::random);
Stream<Integer.>oneStream= Stream.generate(()->1);

파일

Stream<Path.> Files.list(Path dir)

  • list() 는 지정된 디렉토리(dri)에 있는 파일의 목록을 소스로 하는 스트림을 생성해 반환 한다.

Stream<String.> Files.lines(Path dir)

  • 한 행(line)을 요소로 스트림을 생성

Stream<String.> lines()(Path dir)

  • BufferedReaer에 속한 것인데, 파일 뿐만 아니라 다른 입력대상으로부터 데이터를 행단위로 읽어올수 있다.

빈 스트림

  • null보다 빈 스트림을 반환 하는것이 낫다.

Stream emptyStream= Stream.empty();
long count =emptyStream.count() // count값은 0// 스트림 요소 개수 반환

스트림 연결

Stream<String.> str1 = Stream.of(Str1);
Stream<String.> str2 = Stream.of(Str2);
Stream<String.> str3 = Stream.concat(str1,str2) //두 스트림 연결

profile
호주쉐프에서 개발자까지..

0개의 댓글