
생성 → (가공: filter/map/… ) → 결과(collect/reduce/…)
// 배열
String[] arr = {"hello","stream","world"};
Arrays.stream(arr); // 전체
Arrays.stream(arr, 0, 2); // 부분
// 컬렉션
List<String> list = List.of("hello","stream","world");
list.stream(); // 순차
list.parallelStream(); // 병렬
// 빈 스트림
Stream<String> s = list == null || list.isEmpty() ? Stream.empty() : list.stream();
// builder
Stream<String> b = Stream.<String>builder().add("hello").add("stream").add("world").build();
// iterate (수열)
Stream<Integer> it = Stream.iterate(10, x -> x * 2).limit(5); // 10 20 40 80 160
// 기본 타입 (오토박싱 비용↓)
IntStream.range(5, 10); // 5..9
LongStream.rangeClosed(1, 3); // 1..3
new Random().doubles(5).boxed(); // Double 스트림 박싱
// 문자 관련
"Hello Stream".chars(); // IntStream (code point)
Pattern.compile(",").splitAsStream("A,B,C"); // Stream<String>
// 합치기
Stream.concat(Stream.of("A","B"), Stream.of("C","D"));
| 역할 | 메소드 |
|---|---|
| 필터링 | filter(Predicate) · distinct() |
| 변환 | map(Function) · flatMap(Function<…Stream…>) |
| 제한 | limit(n) · skip(n) |
| 정렬 | sorted() · sorted(Comparator) |
| 확인 | peek(Consumer) |
// filter
IntStream.range(0,10).filter(i -> i % 2 == 0).forEach(System.out::print); // 02468
// map
IntStream.range(1,10).filter(i -> i%2==0).map(i -> i*5).forEach(System.out::print); // 10203040
// flatMap (중첩 → 평탄화)
List<List<String>> nested = List.of(List.of("JAVA","SPRING"), List.of("java","spring"));
List<String> flat = nested.stream().flatMap(Collection::stream).toList();
// sorted
List<Integer> sorted = IntStream.of(5,10,99,2,1).boxed().sorted().toList(); // [1,2,5,10,99]
long cnt = IntStream.range(1,10).count();
long sum = IntStream.range(1,10).sum();
OptionalInt max = IntStream.range(1,10).max();
int oddSum = IntStream.range(1,10).filter(i -> i%2==1).sum();
reduceOptionalInt r1 = IntStream.range(1,4).reduce((a,b)->a+b); // 1+2+3
int r2 = IntStream.range(1,4).reduce(100, Integer::sum); // 100+(1+2+3)
int r3 = Stream.of(1,2,3).reduce(100, Integer::sum, Integer::sum);
collectrecord Member(String id, String name) {}
List<Member> members = List.of(
new Member("t1","n1"), new Member("t2","n2"), new Member("t3","n3")
);
// toList
List<String> names = members.stream().map(Member::name).toList();
// joining
String joined = members.stream().map(Member::name).collect(Collectors.joining(" || ", "**", "**"));
// **n1 || n2 || n3**
any/all/noneMatchList<String> s = List.of("Java","Spring","SpringBoot");
boolean any = s.stream().anyMatch(v -> v.contains("p"));
boolean all = s.stream().allMatch(v -> v.length() > 4);
boolean none = s.stream().noneMatch(v -> v.contains("c"));
(A) Thread 상속
class MyThread extends Thread {
@Override public void run() { /* 작업코드 */ }
}
new MyThread().start(); // 반드시 start()로 실행 (run() 직접호출 X)
(B) Runnable 구현
class MyTask implements Runnable {
@Override public void run() { /* 작업코드 */ }
}
new Thread(new MyTask()).start();
차이:
Thread상속은 클래스 상속 점유,Runnable은 구성(Composition)으로 유연.
run()은 일반 메소드 호출(동기 실행)start()가 새 스레드 생성 → run() 실행 (진짜 병렬성)우선순위(Priority): 1~10 (기본 5) — 높을수록 기회↑
Thread t = new Thread(...);
t.setPriority(Thread.MAX_PRIORITY);
라운드로빈: 타임 슬라이스 기반 순환. JVM/OS 정책(코드로 제어 X)
| 메소드 | 설명 |
|---|---|
sleep(ms) | 현재 스레드 잠시 멈춤 |
join() | 다른 스레드 종료까지 대기 |
interrupt() | 차단/대기 중 스레드 깨움(인터럽트 플래그) |
yield() | 실행 양보(스케줄러 힌트) |
wait() | 동기화 블록 내에서 대기(모니터 릴리즈) |
notify() / notifyAll() | 대기중 스레드 하나/전체 깨움 |
// 메소드 전체 동기화
public synchronized void method() { /* 임계구역 */ }
// 블록 동기화
public void method1() {
// ...
synchronized (lock) { /* 임계구역 */ }
// ...
}
map/filter → collect/reduce.flatMap은 중첩 평탄화, Collectors.joining은 문자열 결합 치트키.