inblog logo
|
jay0628
    Java

    [Java] 27. Stream API (3)

    김주희's avatar
    김주희
    Apr 28, 2025
    [Java] 27. Stream API (3)
    💡
    (Java) Stream Api
    (Java) Stream Api

    큰 회사에서 라이브러리를 사용하지 않는 이유?

    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 돼서 기존데이터를 건들지 않기 때문에 불변이다!
    notion image
     
    물가에 던져서 순회는 다 함! 근데
     
    ctrl+space
    notion image
     
     
    .stream().map() = 아직 물가에 있는 상태임 → toList() 전에 추가할 수 있음
     
     
    notion image
     
    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

    1. sorted : 정렬
      1. 기본적으로 오름차순
      2. .sorted(Comparator.reverseOrder()) : 내림차순
      3. (내림차순 물어보는 거 정도는 GPT 물어보기 ㄱㅊ 함수니까)
    1. distinct : 중복 제거
    1. 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

    notion image
    Cart 안에 있는 가격의 합을 구해보자
    1. 물가에 던지기
      1. var new41 = cartList.stream(); : Cart 타입이 물가에 4개 던져진 것 → 그대로 수집하면 컬렉션 안에 Cart 타입이 4개 들어있는 것
      2. 나는 이제 Cart타입이 필요 없음 → 가격만 있으면 됨
    2,.
     
    그룹함수 = 세로연산 = 안에 있는 것들을 연산할 것
    // 1 : 05
    var new41 = cartList.stream() .map(cart -> cart.getPrice()) // 다시 cart로 리턴해야 됨 .toList(); System.out.println(new41);
    notion image
    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);
    notion image
     
    int new41 = cartList.stream() // 1. 물가에 던져진 cart 4개 .mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개 .sum(); System.out.println(new41);
    notion image
     
    var new41 = cartList.stream() // 1. 물가에 던져진 cart 4개 .mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개 .average(); System.out.println(new41);
    notion image
    optional double을 배워야?
     
    var new41 = cartList.stream() // 1. 물가에 던져진 cart 4개 .mapToInt(cart -> cart.getPrice()) // 2. 물가에 던져진 int 4개 .max(); System.out.println(new41);
    notion image
    추후 orElse 를 배워야 됨
     

    5. groupBy

    // 같은 바나나끼리 묶고 싶음 var new51 = cartList.stream() .collect(Collectors.groupingBy(cart -> cart.getName())); // 이름으로 그룹핑 System.out.println(new51);
    notion image
     
    자바에서 중괄호({})로 감싸지면 map 타입임
    key,value니까 hashmap 타입
     
    List로는 못받지만 set으로는 가능(.entrySet()) →
     
    var new51 = cartList.stream() .collect(Collectors.groupingBy(cart -> cart.getName())) // 이름으로 그룹핑 .entrySet(); System.out.println(new51);
    notion image
    맨앞이 대괄호 → 컬렉션이 됨!!
     
     
    var new51 = cartList.stream() .collect(Collectors.groupingBy(cart -> cart.getName())) // 이름으로 그룹핑 .entrySet() .stream() .toList(); System.out.println(new51);
    notion image
    이제 다시 리스트가 됨
     
    앞에 사과 날리고 Cart부터만 가져오고 싶으면
    notion image
     
     
    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);
    notion image
    // 타입 모르겠으면 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);
    notion image
    notion image
     
    Java에는 기본 자료형과 레퍼런스 자료형이 있음
    1. 기본 자료형 : int char double boolean
      1. 메모리에 크기를 미리 세팅할 수 있는 자료형
      2. premitive :원시 자료형
    1. 레퍼런스 자료형 : Integer..
      1. premitive 아님
     
    c1, c2 = 레퍼런스 자료형
    물가에 c1, c2를 던짐
    명확한 타입은 Stream<Cart>
    notion image
     
     
    Stream을 배우면 좋은건
    1. collection을 new할 필요X (물가가 있기 때문에 내가 상자를 미리 만들지 않아도 됨)
      1. notion image
    1. 함수형 → 상태에 대해서 관리하지 않는다(? → 심화에서)
     
     
    다른 프론트와도 연결해서 사용 가능 = rest
    자원을 제공하는 서버 = rest api = 기능을 만들지X?
    휴대폰 앱에서만 차단 기능 만들고 싶다면 api를 수정? 새로 api 만들기?
    → api를 하나 더 만들어서 get 요청했을때 cos를 차단한 api만 하나 더 요청
    물가에 cos를 필터링해서 (filter로 cos와 같지 않은 것 만들면 됨)
     
    Share article

    jay0628

    RSS·Powered by Inblog