구아바 라이브러리 : 가장 유용하고 숨겨진 기능은 무엇입니까? [닫은]


131

나는의 빠른 검사 있었다 구아바 API 하고 제공하는 새로운 콜렉션 유형 ( MultimapBiMap예를 들어 유용 표시) 나는이 프로젝트에 (들) I 작업에 라이브러리를 포함 생각입니다.

그러나 도서관에 큰 도움이되지 않고 기능을 배우는 것이 귀중한 시간을 낭비한다면 도서관을 포함시키는 것에 대한 언급도 있습니다.

프로젝트에 Guava 라이브러리를 포함 시켰으며 예상치 못한 방식으로 유용하다고 입증 되었습니까? 앞으로도 항상 사용 하시겠습니까? 주요 이점 / 시간 절약은 무엇입니까? 숨겨진 기능은 무엇입니까?


4
제목과 질문이 실제로 일치하지 않습니다.
aioobe

4
"새로운 컬렉션 유형 ... 유용한 것 같습니다"와 "라이브러리를 포함하는 데 관심이 있습니다 ... 도서관이 유용하고 이익이 있다고 생각하거나 그렇지 않은 경우
matt b

2017 년 현재 (질문이 마감 됨) 최신 Gradle (4.4.1)을 사용하는 경우 기본적으로 "이 종속성은 내부적으로 사용되며 소비자에게 노출되지 않습니다. Gradle 팀이 거기에 정말 귀중한 것들이 있다고 결정했음을 제안합니다.
마이크 설치류

답변:


158

정말로 구아바의 모든 것이 유용합니다. 나는 그것을 오랫동안 사용 해 왔으며 여전히 손으로하는 것보다 적은 코드를 사용하여 할 수있는 새로운 것을 항상 발견하고 있습니다.

다른 사람들이 내가 실제로 사랑한다고 언급하지 않은 것들 :

  • Multimaps는 훌륭합니다. 와 같은 것을 Map<Foo, Collection<Bar>>사용할 때마다 멀티 맵을 대신 사용하여 키에 매핑 된 기존 컬렉션을 확인하고 지루하지 않은 경우 생성 및 추가하는 지루한 작업을 직접 저장하십시오.
  • OrderingComparator원하는 방식으로 동작하는 을 구축 하는 데 좋습니다.
  • Maps.uniqueIndexand Multimaps.index:이 메소드는 a Iterable및 a 를 작성하고 또는 에 함수를 적용한 결과 값을 인덱싱하는 Function빌드 를 수행합니다. 따라서 항목의 ID를 검색하는 함수를 사용하면 한 줄에 ID별로 항목 목록을 색인 할 수 있습니다.ImmutableMapImmutableListMultimapIterable
  • 이 ... 제공하는 기능 재료 filter, transform대한 클래스 사용의 상세에도 불구하고, 등 Function의과 Predicate들,이 유용한 것으로 나타났습니다. 나는 잘이 읽기 수 있도록 하나의 방법의 예를 제공 여기 .
  • ComparisonChain작고 쉽게 간과되는 클래스는 여러 값을 연속적으로 비교하는 비교 방법을 작성하고 첫 번째 차이가 발견되면 반환해야 할 때 유용합니다. 그것은 그것의 모든 지루함을 제거하여 단지 몇 줄의 체인 메소드 호출을 만듭니다.
  • Objects.equal(Object,Object) -null 안전과 같습니다.
  • Objects.hashCode(Object...) -클래스의 여러 필드를 기반으로 해시 코드를 얻는 쉬운 방법.
  • Objects.firstNonNull(Object,Object) -첫 번째 값이 null 인 경우, 특히 첫 번째 값이 메서드 호출의 결과 인 경우 기본값을 가져 오는 코드가 줄어 듭니다 (일반적인 방법으로 수행하기 전에 변수에 값을 할당해야 함).
  • CharMatcher이미 언급되었지만 매우 강력합니다.
  • Throwables던질 수있는 물건을 던질 수 있습니다. 예를 들어 던질 수있는 물건을 Throwables.propagatea RuntimeException또는 an 인 경우 다시 던지고 Error그것을 감싸고 RuntimeException그렇지 않으면 던질 수 있습니다.

확실히 갈 수는 있지만 일을해야합니다. =) 어쨌든, 내가 좋아하는 것을 나열했지만 사실 구아바의 모든 것이 어떤 상황에서나 유용하다는 것입니다. 그것의 대부분은 매우 자주 유용합니다. 사용하면 더 많은 용도를 발견 할 수 있습니다. 그것을 사용하지 않으면 한 손이 등 뒤로 묶여있는 것처럼 느껴집니다.


2
에 동의합니다 ComparisionChain.
위스키 시라

44

Google에서 2 년 동안 Guava를 효과적으로 사용하고 있습니다. 정말 훌륭합니다.

내가 특히 좋아하는 부분은 다음과 같습니다.

  • Charsets.* -너무 간단하고 유용합니다
  • 컬렉션
  • IO 처리 (한 줄로 리소스를 완전히 읽음 등)
  • Splitter/Joiner
  • Preconditions

6
Java 7 이상 에는 StandardCharsets 가 있습니다. 구아바의 다른 기능 중 얼마나 많은 것이 Java로 도입되었는지 궁금합니다.
DavidS

1
구아바와 같은 타사 라이브러리를 포함하여 레거시 API의 사용을 감지하는 이 Modernizer Maven 플러그인 을 발견했습니다. 구성 파일은 StandardCharsets을 포함하여 67 구아바 중단 된이 포함되어 나타납니다.
DavidS

28

처음에는 컬렉션 속 기용으로 사용했습니다. 예를 들어,

Map<String, Map<Long, List<String>>> map = new HashMap<String, Map<Long, List<String>>>();

당신은 이것을 할 수 있습니다 :

Map<String, Map<Long, List<String>>> map = Maps.newHashMap();

지도를 채우는 것도 쉽습니다.

ImmutableMap<String,String> map = ImmutableMap.of("key1", "value1", "key2", "value2");

이제 구아바에있는 다른 유용한 유틸리티를 발견했습니다. 예를 들어 CharMatcher 클래스를 사용하면 일련의 문자를 일치시킬 수 있습니다. 넌 할 수있어:

CharMatcher.inRange('a','z').or(inRange('A','Z'));

또는

String phoneNumber = CharMatcher.DIGIT.retainFrom("my phone number is 123456789");

21

CharMatcher의 precomputed () 메소드 ( source ) 는 다른 날에 우연히 발견 된 멋진 "숨겨진 기능"입니다.

실제로는 비트 배열을 사용하여 조회 테이블을 만든 다음 문자가 "일치"하는지 확인하는 최적화입니다.

라이브러리를 사용할 때 활용할 수있는 숨겨진 최적화의 일종으로, 자신의 코드에서 자신을 생각하지 않았을 수도 있습니다.

물론 여러 번 사용할 복잡한 CharMatcher를 만드는 경우 다음과 같이 precomputed () 메서드를 호출해야합니다.

CharMatcher complexMatcher = CharMatcher.anyOf("cat")
                                        .or(CharMatcher.DIGIT)
                                        .or(CharMatcher.WHITESPACE)
                                        .precomputed();

또한 guava ListenableFuture에 대한 질문이 있습니다 . 가능한 경우 내 디자인을 검토하고 내 의심의 일부를 명확하게 설명하고 어떻게 처리해야합니까? 나는 최근에 Guava ListenableFuture와 함께 일하기 시작했고 그것들을 효율적으로 사용하는 방법에 대해 약간 혼란스러워했습니다.
john

16

여기의 YouTube 동영상 구글 (스피커 : 케빈 Bourrillion, 구글의 핵심 자바 라이브러리 리드 엔지니어) 구글 컬렉션의 아름다움을 보여줍니다. Google이 훌륭하다고 생각하는 한 가지는 컬렉션의 불변성을 보장 하는 것입니다.


12

Google Guava는 유틸리티 라이브러리이므로 내부에 킬러 클래스가 있는지 의심됩니다. 유틸리티에 관한 모든 것들은 거의 모든 프로젝트에서 사용한다는 것입니다. Java 컬렉션을 사용하지 않는 프로젝트를 기억할 수 없습니다. 사실, 구글 구아바의 수집 유틸리티는 훌륭하고 Java SDK 자체에 있어야합니다.

Google Guava의 수업에 관한 세 가지 기사를 작성했습니다.

그리고 이것이 전부가 아닙니다. 구아바로 할 수있는 다른 많은 것들이 있습니다.


8

절대적으로 매우 유용합니다. 거의 항상 새 프로젝트에 추가 된 첫 번째 라이브러리입니다.

  1. 우리는 Iterators / Iterables와 Function 인터페이스를 매우 좋아합니다.
  2. 인터페이스의 서비스 제품군은 훌륭한 추상화입니다
  3. API 유형의 ImmutableXXX 클래스를 사용하여 변경할 수 없음을 알리기 시작했습니다.
  4. 특정 상황에서는 맵 맵 (MapMaker의)이 훌륭합니다.

전반적으로, 라이브러리는 매우 높은 품질입니다. API는 잘 구현되어 있습니다. 추천.


7

MapMaker는 이제 제한된 LRU 캐시를 제공합니다. 이는 작은 API 뒤에 숨겨져있는 상당한 기계입니다. 이것은 엄청난 유용성을 가지고 있으며 여전히 코드 전체에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.