마트철수

[040] 스트림: 매핑, 정렬, 루핑, 매칭, 집계 본문

KB IT's Your Life/교육

[040] 스트림: 매핑, 정렬, 루핑, 매칭, 집계

마트스 2024. 7. 4. 17:40


2024.07.04(목)

 
JAVA 12일차
 
클래스는 필드, 생성자, 메서드 → #필생메
상속은 메소드 오버라이딩,  다형성, 추상 → #메오다추
문자열은 String 타입 → substring, indexOf, split
main 메소드(혹은 생성자) 안에 위치하면 → 로컬 클래스
 


 

CH17 스트림 요소 처리

 

요소 변환(매핑)

IntStream과 Stream<Integer>은 다름

(Stream<Integer> = 'Integer' Wrapper 클래스에 대한 Stream)

 

요소를 복수 개의 요소로 변환

- faltMapXxx() 메소드: 하나의 요소를 복수 개의 요소들로 변환 ... flatMap(Function<T, Stream<R>>)

 

요소 정렬

 

- Comparable 구현 객체의 정렬

: 구현하고 있어야만 sorted( ) 메소드를 사용하여 정렬 가능

 

public Xxx implements comparable → ... Stream<Xxx> orderStream = stream.sorted( );

내림차순으로 하려면? .sorted(Comparator.reverseOrder( ))

limit 함수도 기억해두면 좋음

 

- Comparable을 구현하고 있지 않다면?

: 비교자를 제공하면 요소 정렬 가능

: sorted((o1, o2) -> { ... })

 

요소를 하나씩 처리(루핑)

: 스트림에서 요소를 하나씩 반복해서 가져와 처리하는 것

: peek과 forEach ... 차이점은 단 하나임(peek은 중간 처리, forEach는 최종 처리)

 

p.50 LoopingExampel.java 예제 확인

# comsumer는 함수형 인터페이스 #뭔가 줬더니 소비해서 리턴값이 없음

 

요소 조건 만족 여부(매칭)

: 요소들이 특정 조건에 만족하는지 여부를 조사하는 최종 처리 기능

: allMatch( ), anyMatch( ), noneMatch( )

 

우선 기본 집계 

: 최종 처리 기능으로 요소들은 처리해서 하나의 값으로 산출

: 스트림이 제공하는 기본 집계 ... Optional (null이 있을 수도 있음)

 

- Optional 클래스

: 집계값이 없으면 디폴트 값을 설정하거나 집계값을 처리하는 Consumer 등록

: OrElse( ) = 디폴트값 지정 /  ifPresent = 값이 있다면 구현

orElse( ) 함수로 Optional 클래스 처리

 

# 예외 발생하면, 디폴트 값으로 null를 넣는게 좋을까? orElseThrow 함수 사용

# orElseThrow( ); ... ( ) ← 예외 인스턴스 넣기(new Exception( )이나 Exception || new)

 

요소 커스텀 집계

 

- 스트림이 제공하는 메소드

: 다양한 집계 결과물을 만들 수 있도록 reduce( ) 메소드 제공

: (a, b) -> ... return 값;} 에서 a, b, 값의 타입이 모두 같다면 Operator

 

- 필터링한 요소 수집

1) Stream의 collect(Collector<T, A, R> collector) 메소드

2) Collector 구현 객체를 얻는 정적 메소드

: toList( ), toSet( ) 함수 사용

 

- 요소 그룹핑

: DB에서 제공해줌

 

요소 병렬 처리

- 동시성: 멀티 작업을 위해 멀티 스레드가 하나의 코어에서 번갈아 가면 실행

- 병렬성: 멀티 작업을 위해 멀티 코어를 각각 이용해서 병렬로 실행

 

포크조인 프레임워크

- fork: 처리할 요소를 잘게 쪼개서 여러 개의 cpu에 할당

→ 한 컴퓨터에서 일어날 수도 있고, 여러 컴퓨터에서 일어날 수 있음

- join: 서브 결과를 결합해서 최종 결과 만듬

 

#functional programming(함수적) = for문과 if문을 안 쓰고 프로그래밍하는 것

 

ch18 데이터 입출력

 

입출력 스트림

- 바이트 스트림: InputStream, OutputStram

- 문자 스트림: Reader, Writer

 

바이트 출력 스트림

: OutputStream / 최상위 클래스로 추상 클래스

- 모든 바이트 출력 스트림이 기본적으로 가져야 할 메소드가 정의됨

- OutoutStreamd의 자식으로 FileOutputStream, printStream, BufferedOutputStream, DataOutputStream

 

★ flush( ): 출력 버퍼에 잔류하는 모든 바이트를 출력

 

WriteExample.java

- 모든 I/O 예외처리 필수

- try-resource문 활용 권장 (교재에서는 해당 내용 제외됨)

- "C:/temp/test1.db" 없으면 새로 생성, 있으면 없애고 아예 새로 생성(덮어쓰기와 약간 다름)

 

바이트 배열 출력

:write(byte[ ] b) 메소드: 매개값으로 주어진 배열의 모든 바이트를 출력

 

InputStream

:바이트 입력 스트림의 최상위 클래스로, 추상 클래스

 

ReadExample.java

- "C:/temp/test1.db" 없으면 예외

Input은 에러 발생 2가지

 

- 바이트 배열로 읽기

: read(byte [ ] b) 메소드

 

ReadExample.java

- byte[ ] data = new byte[100]; ... 100 배열의 크기가 중요, 성능에 영향을 미침

targetFileName = 복사 대상

- os.write(data, 0, num); → os.write(data); 로 작성하면 안됨!

 

#바이트데이터는 모두 가능(있는 그대로 데이터를 읽고 씀)

#텍스트데이터는 실제 데이터를 문자 코드로 이해해야함, 어떤 문자 Set로 읽어야하는지도 정해야함

 

문자 입출력 스트림

: Writer는 문자 출력 스트림의 최상위 클래스로, 추상 클래스.

: FileWriter, BufferedWriter, PrintWriter, outputStreamWriter

 

실습

 

SortingExample

package ch17.sec07.exam01;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class SortingExample {
    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student("홍길동", 30));
        studentList.add(new Student("신용권", 10));
        studentList.add(new Student("유미선", 20));

//        점수를 기준으로 오름차순을 정렬한 새 스트림 얻기
        studentList.stream()
//                sorted: compareTo에 적힌 기준으로 요소들을 비교해서 정렬
//                점수 순으로 정렬돼서 출력됨
                .sorted()
                .forEach(s -> System.out.println(s.getName() + ": " + s.getScore()));
        System.out.println();

//        점수를 기준으로 내림차순으로 정렬한 새 스트림 얻기
        studentList.stream()
//                sorted 내에 Comparator.reverseOrder()을 넣어주면 기존 리스트를 반대 순서로 정렬해준다
                .sorted(Comparator.reverseOrder())
                .forEach(s -> System.out.println(s.getName() + ": " + s.getScore()));

    }
}