이런 분들이 읽으면 좋아요!
멋쟁이사자처럼 클라우드 엔지니어링 부트캠프가 어떻게 운영되는지 궁금한 분
Java Stream API를 공부 중이거나 filter·map·flatMap 차이가 헷갈리는 분
부트캠프 합류 전, 수강생의 실제 공부 방식이 궁금한 분
"처음 자바를 배울 때, 리스트 데이터를 처리하는 코드가 왜 이렇게 복잡하지?" 싶었던 적 있나요? 반복문 안에 조건문, 또 그 안에 정렬 로직까지 쌓이다 보면 코드 자체가 미로가 되어버리곤 하죠. Stream API는 바로 그 복잡함을 해결하기 위해 등장한 자바의 핵심 기능이에요.
멋쟁이사자처럼 부트캠프는 단순히 배우는 것에 그치지 않고, 배운 내용을 내 것으로 만드는 방법까지 함께 고민하고 있어요. 그중 하나가 바로 TIL(Today I Learned) 블로그 챌린지예요. 매일 배운 내용을 글로 정리하면서, 개념은 더 단단해지고 기억은 더 오래 남게 되죠.
오늘 소개할 학습 일기 TIL의 주제는 Java Stream API예요. stream 생성부터 중간처리(filter·sorted·map·flatMap), 최종처리까지 전체 구조를 직접 코드와 함께 정리하고, IntStream과 Stream<Integer>의 차이처럼 헷갈렸던 개념을 스스로 파고든 과정도 담겨 있어요. 멋쟁이사자처럼 클라우드 엔지니어링 부트캠프 수강생의 솔직한 14일차 기록을 지금 확인해 보세요!
💡
이런 분들이 읽으면 좋아요!
멋쟁이사자처럼 클라우드 엔지니어링 부트캠프가 어떻게 운영되는지 궁금한 분
Java Stream API를 공부 중이거나 filter·map·flatMap 차이가 헷갈리는 분
부트캠프 합류 전, 수강생의 실제 공부 방식이 궁금한 분
저번주에 앓고싶어 난리난 갑자증이를 구했다. 무려 냥냥승이다🐱 ( )
구하는 과정이 굉장히 힘난했고, 날씨줄이 라널을 화게 되었으나 지금은 내 존에 딜어 있으니 이 주 뿌듯하다 Vv
부캠도 드디어 2주 차를 돌파했는데 오늘이 전혀 고바겠다. 나는 그만 정신을 털어버리고 말았다 하하 내 기준 게임 어려웠던 날이며 점심시간 이후부터 바보가 된 것 같다 월요일이라 그런가?
닭이 너무 먹어진다. 버타막 먹고싶다 O____0 (역지 유행이라고 돌돌대시 마만)
🍗 오늘 배운 내용 : Stream API
기존의 컬렉션 API(List, Set, Map)는 데이터를 저장/수정/삭제/조회 같은 기능만 제공함.
하지만, 실게 개발에서는 필터링, 정렬, 중복 제거 등이 필요하기 때문에 Stream API를 사용한다. 지난시간에 게생을 잠만 언급했지만에 더 자세한 에서서 실습을 통해 코드 갈아흔 흔이가 블래를 배웠다.
stream 생성
중간처리
최종처리
1) 컬렉션 또는 배열에서 Stream 뽑기
List<String> list = Arrays.asList("a", "b", "c");
list.stream(); // Stream 생성
+) 배열도 가능
Arrays.stream(arr);
2) 중간 처리(데이터 가공 단계) (**************)
여러 개 이어서 사용 가능
실제 실행은 최종처리 전까지 안됨
주요 기능들
가. 필터링 : 조건에 맞는 것만 남김
list.stream()
.filter(s -> s.equals("a"))
나. 정렬(sorted)
list.stream()
.sorted()
다. 데이터 변환(map)
1개 -> 1개로 변환 ex)
list.stream()
.map(s -> s.toUpperCase())
["a","b","c"] → ["A","B","C"]
<map vs flatMap>
map은 하나에서 하나로 변환
["a","b"] → ["A","B"]
flatMap은 하나에서 여러개로 변환 (구조를 펼치는 느낌)
Stream.of("a/b/c")
.flatMap(s -> Arrays.stream(s.split("/")))
결과)
["a","b","c"]
라. skip / limit
list.stream()
.skip(2) // 앞에서 2개 건너뜀
.limit(3) // 3개만 가져옴
3. 최종 처리 (결과 만든 단계) -> 미게 실행되며어 stream이 동작함.
합계 / 평균/ 최대/ 최소 (sum, average, max, min)
ex) 합계
IntStream.of(1,2,3,4)
.sum();
가수
list.stream().count();
반복(forEach)
list.stream()
.forEach(s -> System.out.println(s));
컬렉션 변환 (Set -> List 변환 o)
list.stream()
.collect(Collectors.toList());
Optional ***** : 값이 있을 수도 있고 없을 수도 있음을 표현
null대신 사용
NullPointerException 방지
만만하게 값 처이 → 중요한 이유: stream에서 찾았는데 값이 없으면 null -> 오류 발생 가능
ex)
Optional<String> result =
list.stream().findFirst();
값 꺼내기)
값 없으면 기본값 반환
result.orElse("기본값");
4. 익명클래스, 람다식, 메서드 참조(*****) 상황: 리스트에 있는 이름을 하나씩 출력하기
1) 익명 클래스
Consumer<String> c = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
list.stream().forEach(c);
=> 길고 복잡함 !
2) 람다식, 메서드 참조
가. 람다식
필요한 동작만 간단히 적는것
class 없음
메서드 이름 없음
list.stream().forEach(s -> System.out.println(s));
나. 메서드 참조 (최종 진화)
람다식 안에서 메서드 하나만 쓸 때 사용
list.stream().forEach(System.out::println);
메서드 참조 사용 불가 : 메서드 2개이기 때문
s -> {
System.out.println(s);
System.out.println("끝");
}
1.
✔ 문제상황 숫자 데이터 처리 시 IntStream을 사용하는데 Stream <Integer>과 차이점이 헷갈림
🔴 접근방법 계산은 숫자 전용 기능이라는 점에 집중
✅ 해결방법 IntStream은 숫자 계산에 최적화된 Stream으로 sum(), average()같은 기능이 바로 사용 가능. 물론, Stream <Integer>도 사용 가능하지만 변환이 필요하다.
1) Stream<Integer>
List<Integer> list = Arrays.asList(1,2,3,4);
int sum = list.stream()
.mapToInt(n -> n) // 변환 필요
.sum();
2) IntStream
int sum = Arrays.stream(new int[]{1,2,3,4})
.sum();
=> 훨씬 간편
백엔드를 처음 공부할 때 JDBC 하나를 이해하는 데도 Driver, Facade 패턴, JPA까지 여러 개념이 엮여 있다는 걸 알게 되는 과정 자체가 성장이에요.
멋쟁이사자처럼 부트캠프에서는 이처럼 배운 내용을 기록하고 체계화하는 루틴이 수강생들의 실력으로 자연스럽게 쌓여가고 있어요. 백엔드 개발이 궁금하다면 지금 바로 확인해 보세요.