어떻게 자바 8 Stream API 를 이용 하여 맵 버튼 이나 값 을 정렬 합 니까?

5669 단어 java8map정렬
자바 8 스 트림
자바 8 Streams 를 사용 하면 키 와 값 에 따라 맵 을 정렬 할 수 있 습 니 다.다음은 그의 작업 원리 이다.

자바 스 트림 함수 식 프로 그래 밍?사용 한 적 이 있 으 면 모두 좋다 고 말 하고,사례 도문 을 상세 하 게 너 에 게 줄 게.
  • 맵 이나 리스트 등 집합 클래스 대상 을 스 트림 대상 으로 전환한다
  • Streams 의 sorted()방법 으로 정렬 합 니 다
  • 최종 적 으로 링크 드 HashMap(정렬 순 서 를 유지 할 수 있 음)으로 되 돌려 줍 니 다
  • sorted()방법 은 Comparator 를 매개 변수 로 하여 모든 종류의 값 에 따라 Map 을 정렬 할 수 있 습 니 다.Comparator 에 익숙 하지 않 으 면 본 번호 며칠 전 글 을 볼 수 있 고,한 글 은 Comparator 를 사용 하여 List 를 정렬 하 는 것 을 전문 적 으로 소개 했다.
    2.HashMap 의 merge()함수 학습
    Map 정렬 을 배우 기 전에 HashMap 의 merge()함 수 를 말씀 드릴 필요 가 있 습 니 다.이 함수 응용 장면 은 Key 가 중복 되 었 을 때 Map 의 요소 값 을 어떻게 처리 하 는 지 입 니 다.이 함 수 는 세 개의 인자 가 있다.
    인자 1:map 에 put 키인자 2:map 에 put 의 값4.567917.매개 변수 3:키 가 중복 되면 값 을 어떻게 처리 합 니까?함수 일 수도 있 고 lambda 표현 식 으로 쓸 수도 있 습 니 다
    
        String k = "key";
        HashMap<String, Integer> map = new HashMap<String, Integer>() {{
          put(k, 1);
        }};
        map.merge(k, 2, (oldVal, newVal) -> oldVal + newVal);
    위의 코드 를 보면 우 리 는 먼저 HashMap 을 만 들 고 키 값 이 k:1 인 요 소 를 넣 었 습 니 다.merge 함 수 를 호출 하여 맵 에 k:2 키 가 맞 을 때 k 키 가 중복 되면 뒤의 lambda 표현 식 을 실행 합 니 다.표현 식 의 의 미 는 이전 값 인 oldVal 에 새 값 인 newVal(1+2)을 되 돌려 주 는 것 입 니 다.현재 map 에는 k:3 요소 만 있 습 니 다.
    사실 lambda 표현 식 은 매우 간단 합 니 다.익명 함 수 를 나타 내 고 화살표 왼쪽 은 매개 변수 이 며 화살표 오른쪽 은 함수 체 입 니 다.함수 의 매개 변수 유형 과 반환 값 은 코드 컨 텍스트 에서 확인 합 니 다.
    3.맵 의 키 로 정렬
    다음 예 는 자바 8 Stream 을 사용 하여 맵 의 키 를 눌 러 정렬 합 니 다.
    
    //     Map,     
    Map<String, Integer> codes = new HashMap<>();
    codes.put("United States", 1);
    codes.put("Germany", 49);
    codes.put("France", 33);
    codes.put("China", 86);
    codes.put("Pakistan", 92);
    
    //   Map      
    Map<String, Integer> sortedMap = codes.entrySet().stream()  
        .sorted(Map.Entry.comparingByKey())
        .collect(
            Collectors.toMap(
              Map.Entry::getKey, 
              Map.Entry::getValue,
              (oldVal, newVal) -> oldVal,
              LinkedHashMap::new
            )
        );
    
    //      Map  
    sortedMap.entrySet().forEach(System.out::println);
    위의 두 번 째 코드 를 보십시오.
  • 먼저 entry Set().stream()을 사용 하여 맵 유형 을 Stream 흐름 유형 으로 변환 합 니 다
  • 그 다음 에 sorted 방법 으로 순 서 를 매 긴 다.순 서 는 Map.Entry.coparingByKey(),즉 Map 의 키 에 따라 순 서 를 매 긴 다
  • 마지막 으로 collect 방법 으로 Stream 을 링크 드 하 쉬 맵 으로 전환 합 니 다.다른 매개 변 수 는 모두 말 할 수 있 습 니 다.세 번 째 매개 변 수 를 중점적으로 보면 merge 규칙 의 lambda 표현 식 입 니 다.merge 방법의 세 번 째 매개 변수의 용법 과 일치 합 니 다.이 예 에 중복 되 는 key 가 없 기 때문에 새 값 의 오래된 값 을 마음대로 되 돌려 주면 됩 니 다
  • 위의 프로그램 은 콘 솔 에 다음 내용 을 인쇄 하고 키(국가/지역 이름)를 자 연 스 러 운 알파벳 순 으로 정렬 합 니 다.
    China=86
    France=33
    Germany=49
    Pakistan=92
    United States=1
    정렬 결 과 를 순서대로 저장 하기 위해 링크 드 HashMap 을 사용 하 십시오.기본적으로 Collectors.toMap()은 HashMap 으로 돌아 갑 니 다.HashMap 은 원소 의 순 서 를 보장 할 수 없습니다.
    키 에 따라 역방향 으로 정렬 하려 면 아래 그림 의 빨간색 부분 코드 를 추가 하면 됩 니 다.

    4.Map 의 값 으로 정렬
    물론 Stream API 를 사용 하여 그 값 에 따라 맵 을 정렬 할 수 있 습 니 다.
    
    Map<String, Integer> sortedMap2 = codes.entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            Map.Entry::getValue,
            (oldVal, newVal) -> oldVal,
            LinkedHashMap::new));
    
    sortedMap2.entrySet().forEach(System.out::println);
    이것 은 맵 의 값 순 서 를 표시 하 는 출력 입 니 다:
    United States=1
    France=33
    Germany=49
    China=86
    Pakistan=92
    5.TreeMap 버튼 으로 정렬
    트 리 맵 안의 요소 가 순서 가 있다 는 것 을 모두 가 알 고 있 을 수 있 기 때문에 트 리 맵 을 이용 하여 순 서 를 매 기 는 것 도 바람 직 한 방법 이다.당신 이 해 야 할 일 은 TreeMap 대상 을 만 들 고 데 이 터 를 HashMapput 에서 TreeMap 까지 매우 간단 합 니 다.
    
    //   `HashMap`    `TreeMap`
    Map<String, Integer> sorted = new TreeMap<>(codes);
    이것 은 출력 입 니 다:
    China=86
    France=33
    Germany=49
    Pakistan=92
    United States=1
    위 에서 보 듯 이 키(국가/지역 이름)는 자연 자모 순 으로 정렬 됩 니 다.
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
    링크

    좋은 웹페이지 즐겨찾기