마트철수
[040] 스트림: 매핑, 정렬, 루핑, 매칭, 집계 본문
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 = 값이 있다면 구현

# 예외 발생하면, 디폴트 값으로 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" 없으면 예외

- 바이트 배열로 읽기
: read(byte [ ] b) 메소드
ReadExample.java
- byte[ ] data = new byte[100]; ... 100 배열의 크기가 중요, 성능에 영향을 미침

- 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()));
}
}
'KB IT's Your Life > 교육' 카테고리의 다른 글
| [042] JAVA 마지막: 데이터 입출력 (0) | 2024.07.08 |
|---|---|
| [041] 프로그래머스: 유효한 괄호, 두 큐 합 같게 만들기, 괄호 회전하기, 주식 가격 (1) | 2024.07.05 |
| [039] Java: 람다식, 스트림 (1) | 2024.07.04 |
| [038] Java: 컬렉션 자료구조 (1) | 2024.07.04 |
| [037] Java: 제네릭, 컬렉션 자료구조 (1) | 2024.07.01 |