Guava는 Google에서 개발한 Java 기반의 오픈소스 라이브러리입니다. 컬렉션, 캐싱, 문자열 처리, I/O 등 다양한 유틸리티를 제공합니다.

참고 자료

Guava의 장점

  • 표준화 - Google에서 관리하는 표준 라이브러리
  • 효율성 - Java 표준 라이브러리의 빠르고 효율적인 확장
  • 최적화 - 고도로 최적화된 라이브러리
  • 함수형 프로그래밍 - Java에 함수형 처리 기능 추가
  • 유틸리티 - 애플리케이션 개발에 필요한 다양한 유틸리티 클래스
  • 검증 - 표준 failsafe 검증 메커니즘 제공
  • 모범 사례 - 모범 사례 강조

String 처리

Joiner

컬렉션을 문자열로 결합합니다.

System.out.println(Joiner.on(",")
        .skipNulls()
        .join(Arrays.asList(1,2,3,4,5,null,6)));
// 출력: 1,2,3,4,5,6

Splitter

문자열을 분리합니다.

System.out.println(Splitter.on(',')
        .trimResults()
        .omitEmptyStrings()
        .split("the ,quick, ,brown, fox, jumps, over, the, lazy, little dog."));

CharMatcher

문자를 매칭하고 처리합니다.

// 공백 정리
System.out.println(CharMatcher.WHITESPACE.trimAndCollapseFrom("     Mahesh     Parashar ", ' '));

// 숫자를 *로 대체
System.out.println(CharMatcher.JAVA_DIGIT.replaceFrom("mahesh123", "*"));

// 숫자와 소문자만 유지
System.out.println(CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom("mahesh123"));

CaseFormat

네이밍 컨벤션을 변환합니다.

System.out.println(CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, "test-data"));
// 출력: testData

System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "test_data"));
// 출력: testData

System.out.println(CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, "test_data"));
// 출력: TestData

Collections

BiMap

value도 중복되지 않는 Map입니다.

Table

row, column, value로 구성된 테이블 자료구조입니다.

// Table<R,C,V> == Map<R,Map<C,V>>
Table<String, String, String> employeeTable = HashBasedTable.create();

// 데이터 추가
employeeTable.put("IBM", "101", "Mahesh");
employeeTable.put("IBM", "102", "Ramesh");
employeeTable.put("Microsoft", "111", "Sohan");

// row로 조회
Map<String, String> ibmEmployees = employeeTable.row("IBM");

// column으로 조회
Map<String, String> employerMap = employeeTable.column("102");

// 모든 row key 조회
Set<String> employers = employeeTable.rowKeySet();

LoadingCache

자동 로딩 기능이 있는 캐시입니다.

LoadingCache<String, Employee> employeeCache =
    CacheBuilder.newBuilder()
        .maximumSize(100) // 최대 100개 레코드
        .expireAfterAccess(30, TimeUnit.MINUTES) // 30분 후 만료
        .build(new CacheLoader<String, Employee>() {
            @Override
            public Employee load(String empId) throws Exception {
                // 비용이 큰 호출
                return getFromDatabase(empId);
            }
        });

// 첫 호출시 데이터베이스에서 로드
System.out.println(employeeCache.get("100"));

// 두번째 호출시 캐시에서 반환
System.out.println(employeeCache.get("100"));

Ordering

정렬 관련 유틸리티입니다.

// 생성
Ordering ordering = Ordering.natural();
Ordering ordering = Ordering.from(comparator);

// 사용
Collections.sort(numbers, ordering);
ordering.isOrdered(numbers); // 정렬되었는지 체크
ordering.min(numbers);
ordering.max(numbers);
ordering.reverse();
ordering.nullsFirst();

Range

범위를 표현합니다.

// [a,b] = { x | a <= x <= b}
Range<Integer> range1 = Range.closed(0, 9);

// (a,b) = { x | a < x < b}
Range<Integer> range2 = Range.open(0, 9);

// (a,b] = { x | a < x <= b}
Range<Integer> range3 = Range.openClosed(0, 9);

// [a,b) = { x | a <= x < b}
Range<Integer> range4 = Range.closedOpen(0, 9);

// (9, infinity)
Range<Integer> range5 = Range.greaterThan(9);

// 포함 여부 확인
range1.contains(5);
range1.containsAll(Ints.asList(1, 2, 3));

// 경계 확인
range1.lowerEndpoint();
range1.upperEndpoint();
range5.hasUpperBound();

// 범위 관계
range1.encloses(range6); // 포함 관계
range1.isConnected(range7); // 연결 여부

// 교집합, 합집합
range1.intersection(range8);
range1.span(range8);

Primitive Utilities

다양한 원시타입 유틸리티를 제공합니다.

  • Ints, Bytes, Chars
  • IntMath, LongMath - Math는 double/float으로 처리하기 때문에 int 값은 처리가 느립니다.

Throwables

예외 처리 유틸리티입니다.

Throwables.getStackTraceAsString(e)