스트림 part2

Shaun·2021년 9월 18일
1

JAVA

목록 보기
25/30

스트림 중간 연산

스트림 자르기 - skip() ,limit()

  • 요소를 자를 떄 사용한다

  • skip(3)은 처음 3개의 요소를 건너 띄고 , limit(5)는 스트림의 요소를 5개로 제한

  • 기본형 스트림에도 존재한다/ 반환값만 다름

스트림 걸러내기- filter() , distinct()

Stream<T> filter(Predicate<? super T> predicate)
Stream distinct()

  • filter는 주어진 조건() 에 맞는 요소를 반환, distinct는 중복제거

ex)
IntSteram a = Intstream.rangeclosed(1,10)
a.filter(i->i%==2).foreach(System.out::println) //짝수만 출력

정렬- sorted()

Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)

  • sorted() 는 지정된 Comparator로 스트림을 정렬하는데, Comparator대신 int값을 반환 하는 람다식을 사용하는 것도 가능하다. Comparator을 지정하지 않으면 스트림 요소의 기본정렬기준(comparable)으로 정렬한다. 스트림의 요소가 Comparable을 구현한 클래스가 아니면 예외 발생

  • sorted(Comparator.comparing(기준)) // Comparator static메서드

strStream.sorted() //기본정렬
strStream.sorted(람다식도 가능)
strStream.sorted(Comparator.reverseOrder())//역순 정렬
strStream.sorted(String.CASE_INSENSTIVE_ORDER)// 대소문자 구별 x
strStream.sorted(String.CASE_INSENSTIVE_ORDER,reversed())
strStream.sorted(comparator.comparing(String::length))// 길이순 정렬

- Comparator 인터페이스에 static 메서드와 디폴트 메서드가 많이 추가 되어서 이를 사용하면 정렬이 쉬워진다.

  • 가장 기본적인 메서드는 comparing(기준)이다

comparing(Function<T,U> keyExtractor)
comparing(Function<T,U> keyExtractor, Comparator<T> keyExtractor)

정렬조건 기본형인 경우

comparingInt(ToIntFunction<T> keyExtractor)
comparingLong(ToLongFunction<T> keyExtractor)
comparingDouble(ToDoubleFunction<T> keyExtractor)

Comparable 인경우

  • 매개변수 하나짜리를 사용하면 되고 그렇지 않은 경우 추가적인 매개변수로 정렬기준(Comparator) 을 따로 지정해 줘야한다.

  • 정렬 조건 추가시 thenComapring() 사용

ex)

학생 스트림을 반(ban)별로, 성적순(totalScore)순 ,그리고 이름순으로 정렬하여 출력하면

studentStream.sorted(Comparator.comparing(Student::getBan)
.thenComapring(Student::getTotalScore)
.thenComapring(Student::getName)
.forEach(System.out::println);

메서드 참조에서 람다식으로 바꾸기
Student::getBan -> (Student s) -> s.get.Ban()

map

  • 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할떄 사용한다

  • 중간연산이다.

ex

  1. Stream<File> fileStream= Stream.of(new File("EX1.java)
  2. Stream<String>filenameStream=fileStream.map(File::getName)// 원하는 정보만 뽑아냄
  3. filenameStream.forEach(System.out::println)
  • Stream<File> -> Stream<String>

mapToInt() , mapToLong(),mapToDouble()

  • 요쇼를 문자가아닌 숫자로 반환 하는경우

  • Stream<Integer.> 가아닌 IntStream이 더 효율적이다

  • Stream<T.> -> 기본형 스트림

  1. IntStream ScoreStream = studentStream.mapToInt(Student::getTotalScore);
  2. int TotalScore=ScoreStream.sum();

기본형 스트림 메서드

(IntStrema, LongStream, DoubleStrem...)

int sum() //스트림 모든 요소의 총합
OptionalDouble average() // sum() / (double)count()
OptionalInt max() //스트림 요소 중 제일 큰값
OptionalInt min() // 스트미의 요소 중 제일 작은값

  • 이 메서드들은 최종연산 이므로 호출후 스트림이 닫힌다.

- sum()과 average() 를 모두 호출 해야 할때는 스트림을 또 생성해야하므로 불편하다. -> summaryStatistics()

IntSummarayStatistics

1. IntSummarayStatistics= scoreStream.summarayStatistics();

long totalCount=stat.getCount();
long totalSum=stat.getSum();
double avgScore=stat.getAverage();
int minScore= stat.getMin();
int maxScore= stat.getMax();

기본형 스트림 변환

  • mapToObj() = IntStream(기본형 스트림) ->Stream<T>
  • boxed() = IntStream(기본형 스트림) -> Stream<Integer>
  • chars() = String이나 StringBuffer에 저장된 문자들("1,2,3..." -> IntStream

1.IntStream intStream= new Random().ints(1,46) //1~45 난수발생
2. Stream<String> lottoStream = intStream
.distinct()
.limit(6).sorted
.mapToObj(i->i+","); // 정수를 문자열로 변환

IntStream charStream="12345".chars();
int charSum=charStream.map(ch->ch-'0').sum() //기본형 메서드sum()

Stream<String> -> Intstream = mapToInt(Integer::parseInt)
Stream<Intger> -> Intstream = mapToInt(Integer::intValue)

flatMap() - Stream<T[]>를 Stream<T.>로 변환

  • flatMap()
    Stream<T[]> -> Stream<T>

  • toArray()
    -Stream<Stream<String.>> - >Stream<String[]>

Stream<String[]> strArrStrm = Stream.of(new String[]{"abc"});

Stream<Stream<String.>> = strStr=strArrStrm.map(Arrays::stream); // X

Stream<String> strStrm= strArrStrm.flatMap(Arrays::stream); //ok

  • flatMap()는 map()과 달리 스트림의 스트림이 아닌 스트림으로 만들어 준다.

toArray

  • Stream<Stream<String.>> - >Stream<String[]> =

  • 매개변수를 지정하지 않으면 Object[]을 반환하므로 특정 타입의 생성자 지정해 줘야한다.

Stream<String[]> = strStr=strArrStrm
.map(s->s.toArray(String[]::new);

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

0개의 댓글