자바 의 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)가 변 집합 하지 않 는 특성 은:
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 가 가장 성숙 하고 유행 하 는 모듈 중 하나 라 고 할 수 있다.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 은 유용 한 방법 을 제공 했다.
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자주 사용 하 는 흐름 제한 알고리즘 은 누 출 통 알고리즘,토 큰 통 알고리즘 이 있다.이 두 가지 알고리즘 은 각각 중점 이 있다.
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 공구 꾸러미 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.