![[Java] 27. Stream API (3)](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255BJava%255D%252027.%2520Stream%2520API%2520%283%29%2520%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Djay0628&w=3840&q=75)
큰 회사에서 라이브러리를 사용하지 않는 이유?
LDAP : 내부에 트리구조로 되어있는 폴더
라이브러리가 심어지면 실행 가능한 파일로 빌드해야됨 → jar로 바뀜
로컬 컴퓨터 말고 서비스를 위한 서버로 옮겨서(AWS 같은) 실행하면 필요한 라이브러리가 같이 빌드가 되어있음→ 라이브러리를 바꾸고 싶으면 로컬에서 새로 빌드해서 서버로 push해야됨
lookup(path)으로 LDAP을 찾아감?
LDAP 안에 MySQLDriver.class 를 룩업
LDAP을 바꾸면 재배포 안해도 됨?
JNDI
네이밍으로 디렉토리에 있는ㅇㅓ떤 파일을 찾는 것
LDAP 서버
lookup을 땡기는 기술 = JNDI
라이브러리를 MySQLDriver.class 안에도 있을 수 있음 → 내가 알기 쉽지 않음
걔가 어디를 땡기고 있으면 어디에서 뭘 쓸지 모르니까
APP
= stream (=/= 지금 배우려는 stream과 다름!!!)
OS
stream - 데이터 타입의 집합을 관리할 때 쓴다.
자기한테 감싸져있는 가장 가까운 타입을 벗겨내는 기술
[ a [ b ], [ c ] ] → a를 stream = 가장바깥의 [ ]를 벗겨낸다는것
b만 stream하면 [ 1, 2, [ ] ]와 같은 형태라서 타입이 망가질수 밖에 → 다시 ‘수집’을 해줘야됨
플래턴? 안에 깊은 배열도 플랫하게 해줌
물길이 있으면 제일 위에 백화점
그물에 담긴 생선 → 백화점에 팔려고 했는데 그물에 담지 말고 다른데 담아서 줘 → 타입만 바꾸는?
백화점에서 그물로 주는건 ㄱㅊ 근데 특정 생선이 필요 없대
(코드가 중요한게 아냐!)
우리는 선물박스로 줘야 되는데 물고기에 비늘 있으면 안받아 비늘 빼줘
= 그물에서 꺼내서 비늘 벗기고 선물박스에
내가 들고 있던 데이터 타입을 수신자가 원하는 타입으로 바꾸는것
물길에 뿌린다.
(개울에 던진다 = stream)
a a b c 순서면 내려오면서 b 빼면 두번째 물길에서 a a c가 됨
비늘을 벗긴다 ( = +1)
a+1 a+1 c+1 (중간연산)
새로운 박스에 담음 = 타입 변경?
모든 stream은 새로 new 돼서 기존데이터를 건들지 않기 때문에 불변이다!

물가에 던져서 순회는 다 함! 근데
ctrl+space

.stream().map() = 아직 물가에 있는 상태임 → toList() 전에 추가할 수 있음

var list = Arrays.asList(1, 2, 3, 4, 5); // java에서도 let같은 타입 추론 제공1. map
// 1. map (가공)
// 물가에 1, 2, 3, 4, 5 던짐 (전부 *2해서 가공해서 수집)
var new11 = list.stream().map(i -> i * 2).toList(); //.toList() = 수집
System.out.println(new11);
var new12 = list.stream()
.map(i -> i * 2)
.filter(i -> i != 10) // 연산 2번 - 2, 4, 6, 8만 true로 리턴돼서 false는 물가에서 사라진다.
.toList();
System.out.println(new12);2. filter
filter로 search와 삭제 가능
동일한 것을 찾으면 서치
아닌 것을 찾으면 삭제
// 2. filter (검색, 삭제)
var new21 = list.stream()
.filter(i -> i < 3)
.toList();
System.out.println(new21);3. count, sorted, distinct
- sorted : 정렬
- 기본적으로 오름차순
- .sorted(Comparator.reverseOrder()) : 내림차순
- (내림차순 물어보는 거 정도는 GPT 물어보기 ㄱㅊ 함수니까)
- distinct : 중복 제거
- count : 개수
// 3. count(개수), sorted(정렬), distinct(중복제거)
var new31 = list.stream()
.sorted(Comparator.reverseOrder()) // Comparator.reverseOrder() : 내림차순
.map(i -> i / 3) // [1, 1, 1, 0, 0]
.distinct() // 1, 0만 남는다
.count(); // 배열의 개수
System.out.println(new31);4. mapToInt, sum, min, max, average

Cart 안에 있는 가격의 합을 구해보자
- 물가에 던지기
var new41 = cartList.stream();: Cart 타입이 물가에 4개 던져진 것 → 그대로 수집하면 컬렉션 안에 Cart 타입이 4개 들어있는 것- 나는 이제 Cart타입이 필요 없음 → 가격만 있으면 됨
2,.
그룹함수 = 세로연산 = 안에 있는 것들을 연산할 것
// 1 : 05
var new41 = cartList.stream()
.map(cart -> cart.getPrice()) // 다시 cart로 리턴해야 됨
.toList();
System.out.println(new41);
List<Cart> new41 = cartList.stream() .map(cart -> cart.getPrice()) .sum(); System.out.println(new41);
var new41 = cartList.stream() // 1. 물가에 던져진 cart 4개
.mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개
.sum();
System.out.println(new41);
int new41 = cartList.stream() // 1. 물가에 던져진 cart 4개
.mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개
.sum();
System.out.println(new41);
var new41 = cartList.stream() // 1. 물가에 던져진 cart 4개
.mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개
.average();
System.out.println(new41);
optional double을 배워야?
var new41 = cartList.stream() // 1. 물가에 던져진 cart 4개
.mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개
.max();
System.out.println(new41);
추후 orElse 를 배워야 됨
5. groupBy
// 같은 바나나끼리 묶고 싶음
var new51 = cartList.stream()
.collect(Collectors.groupingBy(cart -> cart.getName())); // 이름으로 그룹핑
System.out.println(new51);
자바에서 중괄호({})로 감싸지면 map 타입임
key,value니까 hashmap 타입
List로는 못받지만 set으로는 가능(.entrySet()) →
var new51 = cartList.stream()
.collect(Collectors.groupingBy(cart -> cart.getName())) // 이름으로 그룹핑
.entrySet();
System.out.println(new51);
맨앞이 대괄호 → 컬렉션이 됨!!
var new51 = cartList.stream()
.collect(Collectors.groupingBy(cart -> cart.getName())) // 이름으로 그룹핑
.entrySet()
.stream()
.toList();
System.out.println(new51);
이제 다시 리스트가 됨
앞에 사과 날리고 Cart부터만 가져오고 싶으면

entry나 collect는 중요하지 x
물가에 뿌리고 가공하고 수집하는게 중요!!! 이 세가지 개념이 잡혀야 된다
두번째는 cartList가 있는데 그룹핑하려고 할때 Collectors.groupingBy 같은거 알 수도 없음 → 찾아보면 됨 못 외움 → 걍 익숙해지는 것 ( 다른 언어쓰면 다른 방법으로 쓰니까)
.collect와 .toList는 수집연산임!!!
옛날에는 .collect(Collectors.toList())
.collect는 가공 없이 수집하는 것 → 수집했으니까 타입이 생긴것 → 타입이 생겼으니까 다시 물가에 던지려면
var new51 = cartList.stream()
.collect(Collectors.groupingBy(cart -> cart.getName())) // map 타입임 -> 컬렉션이 아니니까 일단 set으로
.entrySet()
.stream() // 여기까지는 set 타입
.map(en -> en.getValue())
.toList();
System.out.println(new51);
// 타입 모르겠으면 java에서 map set 이 부분 다시 봐야 됨
컬렉션 타입이 아니면 물가에 못 돌림 = .stream을 못씀 → set으로 일단 만듦
set = 중복이 제거된 list인 컬렉션
사과=[]에서 사과는 key이고 []는 value임
수집 → 던지기 → 가공 → 수집 → 던지기 → 가공 → 수집 : 무한 반복 가능
보기 어려우면 gson 사용
var new51 = cartList.stream()
.collect(Collectors.groupingBy(cart -> cart.getName())) // 이름으로 그룹핑
.entrySet()
.stream() // 여기까지는 set 타입
.map(e -> e.getValue())
.toList();
System.out.println(new51);
Gson gson = new Gson();
String json = gson.toJson(new51);
System.out.println(json);

Java에는 기본 자료형과 레퍼런스 자료형이 있음
- 기본 자료형 : int char double boolean
- 메모리에 크기를 미리 세팅할 수 있는 자료형
- premitive :원시 자료형
- 레퍼런스 자료형 : Integer..
- premitive 아님
c1, c2 = 레퍼런스 자료형
물가에 c1, c2를 던짐
명확한 타입은 Stream<Cart>

Stream을 배우면 좋은건
- collection을 new할 필요X (물가가 있기 때문에 내가 상자를 미리 만들지 않아도 됨)

- 함수형 → 상태에 대해서 관리하지 않는다(? → 심화에서)
다른 프론트와도 연결해서 사용 가능 = rest
자원을 제공하는 서버 = rest api = 기능을 만들지X?
휴대폰 앱에서만 차단 기능 만들고 싶다면 api를 수정? 새로 api 만들기?
→ api를 하나 더 만들어서 get 요청했을때 cos를 차단한 api만 하나 더 요청
물가에 cos를 필터링해서 (filter로 cos와 같지 않은 것 만들면 됨)
Share article