자바 의 Guava 공구 꾸러미 소개

13609 단어 자바Guava
집합 하 다.
일반 집합

List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();
집합,집합,차 집합 설정

HashSet<Integer> setA = Sets.newHashSet(1, 2, 3, 4, 5);
HashSet<Integer> setB = Sets.newHashSet(4, 5, 6, 7, 8);
Sets.SetView<Integer> union = Sets.union(setA, setB);
System.out.println("union:" + union);
Sets.SetView<Integer> difference = Sets.difference(setA, setB);
System.out.println("difference:" + difference);
Sets.SetView<Integer> intersection = Sets.intersection(setA, setB);
System.out.println("intersection:" + intersection);
map 교 집합

HashMap<String, Integer> mapA = Maps.newHashMap();
mapA.put("a", 1);
mapA.put("b", 2);
mapA.put("c", 3);
HashMap<String, Integer> mapB = Maps.newHashMap();
mapB.put("b", 20);
mapB.put("c", 3);
mapB.put("d", 4);
MapDifference<String, Integer> differenceMap = Maps.difference(mapA, mapB);
Map<String, MapDifference.ValueDifference<Integer>> entriesDiffering = differenceMap.entriesDiffering();
//    
Map<String, Integer> entriesOnlyLeft = differenceMap.entriesOnlyOnLeft();
//    
Map<String, Integer> entriesOnlyRight = differenceMap.entriesOnlyOnRight();
//  
Map<String, Integer> entriesInCommon = differenceMap.entriesInCommon();
System.out.println(entriesDiffering);   // {b=(2, 20)}
System.out.println(entriesOnlyLeft);    // {a=1}
System.out.println(entriesOnlyRight);   // {d=4}
System.out.println(entriesInCommon);    // {c=3}
가 변 집합(immutable)
가 변 집합 하지 않 는 특성 은:
  • 다 중 스 레 드 작업 에서 스 레 드 가 안전 합 니 다.
  • 모든 가 변 집합 은 가 변 집합 보다 자원 을 더욱 효과적으로 이용 할 수 있다.
  • 중간 에 바 꿀 수 없습니다.
  • 초기 화 된 후에 바 꿀 수 없 는 집합 을 만 드 는 것 이 필요 하 다 면 도구 류 가 수정 한 API 를 제공 하지 않 았 기 때문에 실 수 를 할 기회 조차 없다 는 것 을 의미 합 니 다.
    
    ImmutableList<Integer> iList = ImmutableList.of(12,54,87);
    ImmutableSet<Integer> iSet = ImmutableSet.of(354,54,764,354);
    ImmutableMap<String, Integer> iMap = ImmutableMap.of("k1", 453, "k2", 534);
    이상 Immutable 에서 시작 하 는 집합 류 의 add,remove 방법 은 모두 deprecated 로 밝 혀 졌 습 니 다.이 방법 들 이 deprecated 라 는 것 을 알 게 되 었 을 때 아직도 사용 하려 고 하 는 것 은 아니 겠 지?
    주의:모든 Guava immutable 집합 류 의 실현 은 null 값 을 거부 합 니 다.
    재 미 있 는 집합
    MultiSet:무질서+반복 가능
    우리 이미지 의 Set 는 무질서 해 야 합 니 다.요 소 는 중복 할 수 없습니다.MultiSet 은 반복 할 수 있 기 때문에 삼 관 을 전복 시 켰 다.
    MultiSet 을 정의 하고 요 소 를 추가 합 니 다:
    
    Multiset<Integer> set = HashMultiset.create();
    set.add(3);
    set.add(3);
    set.add(4);
    set.add(5);
    set.add(4);
    지정 한 개수 의 같은 요 소 를 추가 할 수 있 습 니 다:
    
    set.add(7, 3);
    이것 은 네가 7 을 3 개 추가 하고 싶다 는 것 을 나타 낸다.
    인쇄 된 MultiSet 도 재 미 있 습 니 다.
    
    [3 x 2, 4 x 2, 5, 7 x 3]
    둘,셋,둘,넷,하나,다섯,셋,일곱.
    어떤 요소 의 개 수 를 가 져 옵 니 다:
    
    int count = set.count(3);
    이 도구 류 는 정말 재 미 있 습 니 다.워드 count 를 실현 하 는 데 도움 을 주 었 습 니 다.
    Multimap:key 중복 가능 한 map
    이 맵 도 재 밌 어 요.정상 적 인 맵 은 서로 다른 키 를 구분 하기 위해 서 좋 습 니 다.직접 키 를 드 리 겠 습 니 다.
    
    Multimap<String, String> map = LinkedHashMultimap.create();
    map.put("key", "haha");
    map.put("key", "haha1");
    Collection<String> key = map.get("key");
    System.out.println(key);
    사용 은 간단 합 니 다.하나의 key 로 이 key 에 대응 하 는 두 개의 값 을 얻 을 수 있 고 결 과 는 list 로 되 돌려 줍 니 다.제 가 무식 한 것 을 용서 하 십시오.저 는 이 맵 이 사용 할 수 있 는 장면 을 아직 생각 하지 못 했 습 니 다.

    Multimap 는 다양한 실현 을 제공 합 니 다:
    멀 티 맵 구현
    key 필드 형식
    value 필드 형식
    ArrayListMultimap
    HashMap
    ArrayList
    HashMultimap
    HashMap
    HashSet
    LinkedListMultimap
    LinkedHashMap
    LinkedList
    LinkedHashMultimap
    LinkedHashMap
    LinkedHashSet
    TreeMultimap
    TreeMap
    TreeSet
    ImmutableListMultimap
    ImmutableMap
    ImmutableList
    ImmutableSetMultimap
    ImmutableMap
    ImmutableSet
    쌍방 향 지도
    (Bidirectional Map)키 와 값 을 반복 할 수 없습니다.
    이거 좀 정상 이 야.키 가 중복 되면 키 를 덮어 쓰 고,value 가 중복 되면 오 류 를 보고 합 니 다.
    
    public static void main(String[] args) {
      BiMap<String, String> biMap = HashBiMap.create();
      biMap.put("key", "haha");
      biMap.put("key", "haha1");
      biMap.put("key1", "haha");
      String value = biMap.get("key");
      System.out.println(value);
    }
    위의 예제 에서 키'key'는 두 개 있 습 니 다.get 을 실행 할 때'haha 1'으로'haha'를 덮어 씁 니 다.또한 value 는'haha'도 두 개 있 습 니 다.위의 코드 를 실행 하 는 것 이 잘못 되 지 않 는 다 는 것 을 알 수 있 습 니 다.이것 은'key'에 대응 하 는 value 가'haha 1'에 의 해 덮어 졌 기 때 문 입 니 다.그렇지 않 으 면 잘못 보고 할 것 이다.
    더 블 키 맵-슈퍼 실 용
    두 키 의 맵,나 는 갑자기 신대륙 을 발견 한 것 을 느 꼈 다.예 를 들 어 저 는 직무 와 부서 에 따라 회사 직원 을 구분 하 는 업무 장면 이 있 습 니 다.key 는 직위+부서 로 문자열 을 구성 할 수 있 습 니 다.그러면 우 리 는 맵 을 두 번 눌 렀 을 때 이런 고민 이 없습니다.
    
    public static void main(String[] args) {
      Table<String, String, List<Object>> tables = HashBasedTable.create();
      tables.put("   ", "  ", Lists.newArrayList());
      tables.put("   ", "  ",Lists.newArrayList());
      tables.put("   ", "  ",Lists.newArrayList());
      System.out.println(tables);
    }
    도구 클래스
    JDK 에서 귀 에 익 은 것 은 Collections 이라는 집합 도구 류 로 기본 적 인 집합 처리 전환 기능 을 제공 했다.그러나 실제 사용 에서 많은 수 요 는 간단 한 정렬 이나 수치 크기 를 비교 한 다음 에 Guava 는 이 를 바탕 으로 많은 개선 을 했 고 Guava 가 가장 성숙 하고 유행 하 는 모듈 중 하나 라 고 할 수 있다.
  • 배열 관련:Lists
  • 집합 관련:Sets
  • 지도 관련:Maps
  • 연결 부(Joiner)와 구분자(Splitter)
    Joiner 는 연결 문자 로 사용 하기 가 매우 간단 합 니 다.다음 예 는 list 를 연결 문자 로 연결 하 는 문자열 로 바 꾸 는 것 입 니 다.
    
    List<Integer> list = Lists.newArrayList();
    list.add(34);
    list.add(64);
    list.add(267);
    list.add(865);
    String result = Joiner.skipNulls().on("-").join(list);
    System.out.println(result);
      :34-64-267-865
    
    맵 을 사용자 정의 연결 문자 로 연결 하 는 문자열 로 변환 합 니 다:
    
    Map<String, Integer> map = Maps.newHashMap();
    map.put("key1", 45);
    map.put("key2",234);
    String result = Joiner.on(",").withKeyValueSeparator("=").join(map);
    System.out.println(result);
      :
    key1=45,key2=234
    구분자 Splitter 의 사용 도 간단 합 니 다:
    
    String str = "1-2-3-4-5-6";
    List<String> list = Splitter.on("-").splitToList(str);
    System.out.println(list);
      :
    [1, 2, 3, 4, 5, 6]
    문자열 에 빈 칸 이 있 으 면 먼저 빈 칸 을 지 울 수 있 습 니 다.
    
    String str = "1-2-3-4-  5-  6   ";
    List<String> list = Splitter.on("-").omitEmptyStrings().trimResults().splitToList(str);
    System.out.println(list);
    String 을 map 로 변환:
    
    String str = "key1=54,key2=28";
    Map<String,String> map = Splitter.on(",").withKeyValueSeparator("=").split(str);
    System.out.println(map);
      :
    {key1=54, key2=28}
    Comparator 의 실현
    자바 에 서 는 대상 을 정렬 할 수 있 는 Comparator 를 제공 합 니 다.Guava 는 정렬 기 Ordering 류 를 제공 하여 많은 실 용적 인 조작 을 밀봉 했다.
    Ordering 은 유용 한 방법 을 제공 했다.
  • natural() 정렬 가능 한 유형 에 대해 자 연 스 럽 게 정렬 합 니 다.예 를 들 어 숫자 는 크기 에 따라 날 짜 는 선후 로
  • 을 정렬 합 니 다.
  • usingToString() 대상 문자열 형식 으로 사전 정렬[lexicographical ordering]
  • from(Comparator) 주어진 Comparator 를 정렬 기
  • 으로 변환 합 니 다.
  • reverse() 의미 가 반대 되 는 정렬 기
  • 가 져 오기
  • nullsFirst() 현재 정렬 기 를 사용 하지만,null 값 을 맨 앞 에 추가 합 니 다.
  • nullsLast() 현재 정렬 기 를 사용 하지만,null 값 을 맨 뒤로 추가 합 니 다.
  • compound(Comparator) 현재 정렬 기 에서 같은 상황 을 처리 하기 위해 다른 비교 기 를 합성 합 니 다.lexicographical() 처리 형식 T 의 정렬 기 를 기반 으로 교체 가능 한 대상 Iterable 의 정렬 기 를 되 돌려 줍 니 다.
  • onResultOf(Function) 집합 중의 요소 에 대해 Function 을 호출 하고 반환 값 에 따라 현재 정렬 기로 정렬 합 니 다.
  • 예시:
    
    UserInfo build = UserInfo.builder().uid(234L).gender(1).build();
    UserInfo build1 = UserInfo.builder().uid(4354L).gender(0).build();
    Ordering<UserInfo> byOrdering = Ordering.natural().nullsFirst().onResultOf((Function<UserInfo, Comparable<Integer>>) input -> input.getGender());
    System.out.println(byOrdering.compare(build1, build));
    build 의 gender 는 build 1 보다 크 기 때문에-1 을 되 돌려 주 고 반대로 1 을 되 돌려 줍 니 다.
    중간 코드 실행 시간 통계
    Stopwatch 클래스 는 시간 통계 기능 을 제공 합 니 다.System.currentTimeMillis()를 호출 하 는 논 리 를 봉인 하 는 것 과 같 습 니 다.
    
    Stopwatch stopwatch = Stopwatch.createStarted();
    try {
      //TODO       
      Thread.sleep(2000L);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    long nanos = stopwatch.elapsed(TimeUnit.SECONDS);
    System.out.println(nanos);
    Guava Cache-로 컬 캐 시 구성 요소
    Guava Cache 는 일상적인 사용 에서 매우 빈번 하 며 심지어 이것 이 제3자 가 제공 하 는 도구 류 라 는 것 을 의식 하지 못 하고 JDK 자체 의 실현 으로 여 긴 다.
    
    // LoadingCache Cache     
    LoadingCache<String, Object> cache = CacheBuilder.newBuilder()
      //      
      .maximumSize(1000)
      //      
      .expireAfterWrite(10, TimeUnit.MINUTES)
      //              
      .refreshAfterWrite(2, TimeUnit.MINUTES)
      //         
      .recordStats()
      //    
      .build(new CacheLoader<String, Object>() {
        //        key   value       
        @Override
        public Object load(String s) throws Exception {
          return new Object();
        }
        //            load            
        @Override
        public Map<String, Object> loadAll(Iterable<? extends String> keys) throws Exception {
          return super.loadAll(keys);
        }
      });
    
    로 컬 캐 시 설정 은 CacheBuilder.newBuilder()를 사용 합 니 다.캐 시 크기 설정,캐 시 만 료 시간,캐 시 새로 고침 빈도 등 을 지원 합 니 다.캐 시 적중률 을 집계 하고 싶다 면,Guava Cache 도 현재 캐 시가 유효한 지 확인 할 수 있 는 능력 을 제공 합 니 다.
    또한 캐 시가 어떤 이유 로 자동 으로 리 셋 되 거나 삭제 되 지 않 으 면 Guava Cache 도 사용자 가 API 리 셋 을 수 동 으로 호출 하거나 캐 시 를 지 울 수 있 도록 지원 합 니 다.
    
    cache.invalidateAll();//       
    //     :               ,          ――           
    //            Cache.cleanUp();
    cache.cleanUp();
    //                     ,          
    cache.refresh("key");
    단기 흐름 제한 도구 류-RateLimiter
    자주 사용 하 는 흐름 제한 알고리즘 은 누 출 통 알고리즘,토 큰 통 알고리즘 이 있다.이 두 가지 알고리즘 은 각각 중점 이 있다.
  • 누 통 알고리즘:누 통 의 뜻 은 마치 깔때기 처럼 물이 한 방울 한 방울 떨 어 지고 흘러 나 오 는 것 이 고 른 속도 이다.방 문 량 이 너무 많 을 때 이 깔때기 는 물이 고인 다.누 출 통 알고리즘 의 실현 은 대기 열 에 의존 하고,프로세서 가 대기 열 에서 고정된 주파수 에 따라 데 이 터 를 꺼 내 처리한다.요청 양 이 너무 많아 대기 열 이 가득 쌓 이면 새로운 요청 은 버 려 집 니 다.누 출 통 은 일반적으로 고정된 속도 에 따라 흘러 나온다.
  • 영패 통 은 고정 용량 을 저장 하 는 영패 로 고정 속도 에 따라 통 에서 영패 를 꺼낸다.처음에 통 에 고정 용량 토 큰 을 추가 하고 통 에 토 큰 이 부족 할 때 새로운 요청 을 거절 합 니 다.토 큰 통 은 토 큰 을 꺼 내 는 속 도 를 제한 하지 않 고 토 큰 만 있 으 면 처리 할 수 있 습 니 다.그래서 토 큰 통 은 어느 정도 의 돌발 을 허용 하고 누 출 통 의 주요 목적 은 부 드 럽 게 흘러 나 오 는 것 이다.
  • Rate Limiter 는 토 큰 통 알고리즘 을 사용 하여 두 가지 흐름 제한 실현 방안 을 제공 합 니 다.
  • 평활 돌발 제한 흐름(SmoothBursty)
  • 평활 예열 제한 흐름(Smooth WarmingUp)
  • 부 드 러 운 돌발 제한 흐름 을 실현 하기 위해 RateLimiter 가 제공 하 는 정적 방법 으로 만 듭 니 다.
    
    RateLimiter r = RateLimiter.create(5);
    while (true) {
      System.out.println("get 1 tokens: " + r.acquire() + "s");
    }
      :
    get 1 tokens: 0.0s
    get 1 tokens: 0.197059s
    get 1 tokens: 0.195338s
    get 1 tokens: 0.196918s
    get 1 tokens: 0.19955s
    get 1 tokens: 0.199062s
    get 1 tokens: 0.195589s
    get 1 tokens: 0.195061s
    ......  
    1 초 에 설치 하 는 토 큰 수 는 5 개 로 기본 0.2s 는 1 회 에 1 초 에 5 개 씩 설정 합 니 다.1 초 에 5 개 를 넘 지 않도록 부 드 러 운 출력 효 과 를 얻 었 습 니 다.
    토 큰 통 을 사용 하 라 는 요청 이 없 을 때 토 큰 은 먼저 만들어 서 통 에 넣 습 니 다.그래서 이때 갑자기 데이터 가 들 어 오 면 통 에 토 큰 이 충분 하기 때문에 빠 른 응답 을 할 수 있 습 니 다.Rate Limiter 는 토 큰 을 충분히 발급 하지 못 했 을 때 지연 처리 방식 을 사용 합 니 다.이전 요청 이 토 큰 을 가 져 오 는 데 필요 한 시간 은 다음 요청 으로 받 습 니 다.
    부 드 러 운 예열 제한 흐름 은 부 드 러 운 돌발 제한 흐름 처럼 모든 토 큰 을 먼저 만 들 지 않 습 니 다.시작 하면 예열 기 가 있 고 배포 빈 도 를 설정 속도 로 향상 시 킵 니 다.
    예 를 들 어 다음 예 를 들 어 평균 배포 토 큰 속 도 는 2 이 고 예열 기 는 3 분 이다.예열 시간 이 3 초 로 설정 되 어 있 기 때문에 토 큰 통 은 처음에 0.5 초 에 토 큰 을 보 내지 않 고 부 드 러 운 선형 으로 떨 어 지 는 경사 가 형성 되 었 고 빈도 가 점점 높 아 졌 으 며 3 초 안에 원래 설 치 된 주파수 에 이 르 렀 고 그 후에 고정된 주파수 로 출력 되 었 다.이런 기능 은 시스템 이 시작 되 자마자 몸 을 풀기 위해 약간의 시간 이 필요 한 장면 에 적합 하 다.
    
    RateLimiter r = RateLimiter.create(2, 3, TimeUnit.SECONDS);
    while (true) {
      System.out.println("get 1 tokens: " + r.acquire(1) + "s");
      System.out.println("get 1 tokens: " + r.acquire(1) + "s");
      System.out.println("end");
    }
      :
    get 1 tokens: 0.0s
    get 1 tokens: 1.33068s
    end
    get 1 tokens: 0.995792s
    get 1 tokens: 0.662838s
    end
    get 1 tokens: 0.494775s
    get 1 tokens: 0.497293s
    end
    get 1 tokens: 0.49966s
    get 1 tokens: 0.49625s
    end
    위의 출력 을 보면 앞의 두 번 영 패 를 얻 는 데 시간 이 걸 리 고 앞으로 점점 평온 해 집 니 다.
    오늘 소개 해 드 리 는 Guava 도구 류 는 이 정도 입 니 다.하지만 JDK 8 부터 자바 공식 API 도 보완 되 고 있 습 니 다.예 를 들 어 문자열 과 관련 된 기능 인 JDK 도 강력 합 니 다.모두 공구 이 니,쓰기 좋 은 것 을 써 라.
    자바 의 Guava 공구 꾸러미 에 관 한 이 글 은 여기까지 입 니 다.더 많은 관련 Guava 공구 꾸러미 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기