허원철의 개발 블로그

Google - Guava 본문

java

Google - Guava

허원철 2017. 4. 6. 13:40
구글에서는 안드로이드 버전 네이밍을 유명 과자이름로 붙이는 방식으로 하고 있습니다.(오늘날까지는 오레오까지 확인되었습니다.) 이 와 비슷하게 자바 프레임워크인 Guice도 있고, 유틸성(?) 라이브러리 Guava라는 것이 있는데, 이번에는 그 중 Guava를 소개하고자 하는 글 입니다.
 

 

Guava 맛보기
 
- 유틸성 라이브러리이다보니, Spring Framework에서 제공해주는 것과 흡사한 것도 있고, 중복되는 것도 있습니다.
 
1) StopWatch
- Spring Framwork에서도 Stopwatch 존재합니다
 
1
2
3
4
5
6
7
8
9
10
@Before
public void before_start() {
    stopwatch = Stopwatch.createStarted();
}
// ...
@After
public void after_stop() {
    stopwatch.stop();
    System.out.println("Test Time : " + stopwatch);
}
cs

2) Strings
 
① isNullOrEmpty
- Spring Framework에서 StringUtils.isEmpty() 존재합니다.
- 메소드 네이밍이 조금 더 명확한 표현인 듯 합니다.
 
1
2
3
4
5
@Test
public void test_isNullOrEmpty() throws Exception {
    Assert.assertTrue(Strings.isNullOrEmpty(""));
    Assert.assertTrue(Strings.isNullOrEmpty(null));
}
cs

② repeat
- 반복하고자 하는 문자열을 n번 반복 가능합니다.
 
1
2
3
4
5
6
@Test
public void test_repeat() throws Exception {
    Assert.assertEquals("String is same content",
            Strings.repeat("wonchul "2),
            "wonchul wonchul ");
}
cs

3) Joiner
- 서로 다른 문자열을 구분자를 넣어 하나의 문자열로 합칠 수 있습니다.

1
2
3
4
5
6
7
@Test
public void test_joiner() throws Exception {
    Joiner joiner = Joiner.on(",").skipNulls();
    String joinNumber = joiner.join("1"null"3""4");
 
    Assert.assertEquals("1,3,4", joinNumber);
}
cs
 
① mapJoiner
-  map의 key : value를 문자열로 원하는 표현을 할 수 있습니다.
 
1
2
3
4
5
6
7
8
9
10
@Test
public void test_joinerMapJoiner() throws Exception {
    Joiner.MapJoiner mapJoiner = Joiner.on("&").withKeyValueSeparator("=");
 
    Map<StringString> map = Maps.newHashMap();
    map.put("key""param");
    map.put("key2""param2");
 
    Assert.assertEquals(mapJoiner.join(map), "key2=param2&key=param");
}
cs

4) Splitter
- 하나의 문자열을 구분자를 통해 나눌 수 있습니다.
 
1
2
3
4
5
@Test
public void test_splitter() throws Exception {
    Splitter splitter = Splitter.on(";");
    splitter.split("heo;won;chul").forEach(System.out::println);
}
cs
 
① mapSplitter
- mapJoiner의 반대되는 기능이라고 볼 수 있습니다.
  
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test_splitterMapSplitter() throws Exception {
    Splitter.MapSplitter mapSplitter = Splitter.on("&").withKeyValueSeparator("=");
 
    Map<StringString> map = Maps.newHashMap();
    map.put("key""param");
    map.put("key2""param2");
 
    Map<StringString> map2 = mapSplitter.split("key2=param2&key=param");
 
    Assert.assertEquals(map.get("key"), map2.get("key"));
}
cs
 
5) ImmutableCollection
- 값을 추가하고 제거 할 수 없는 Collection Class를 만들 수 있습니다.
 
1
ImmutableCollection<Integer> IMMUTABLE_NUMBERS = ImmutableSet.of(12345);
cs
 
※ add/remove 시, UnsupportedOperationException 발생합니다.
 
6) Collection
- 조금 더 간추려진 코드를 만들 수 있습니다.
 
newArrayList
- 인스턴스 생성을 조금 더 간결하게 해줍니다.
 
1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test_newArrayList() {
    Lists.newArrayList(123456789).forEach(System.out::println);
 
    // JDK 6 이하
    List<Integer> list1 = new ArrayList<Integer>();
 
    // JDK 7 이상
    List<Integer> list2 = new ArrayList<>();
 
    // Guava
    List<Integer> list3 = Lists.newArrayList();
}
cs
 
② partition
- 사이즈 지정하여 Collection을 나눌 때 유용하게 사용될 수 있습니다.
  
1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test_partitionToLists() {
    Integer groupSize = 3;
 
    List<Integer> numberList = Lists.newArrayList(123456789);
 
    Lists.partition(numberList, groupSize)
         .forEach(list -> {
              list.forEach(System.out::print);
              System.out.println();
         });
}
cs
 
③ cartesianProduct
- SQL CROSS JOIN과 같은 기능을 합니다. 
 
1
2
3
4
5
6
7
8
@Test
public void test_cartesianProduct() {
    List<Integer> numberList1 = Lists.newArrayList(12);
    List<Integer> numberList2 = Lists.newArrayList(34);
 
    Lists.cartesianProduct(numberList1, numberList2)
         .forEach(System.out::println);
}
cs
 
④ reverse
 
1
2
3
4
5
@Test
public void test_reverse() {
    List<Integer> numberList = Lists.newArrayList(123456789);
    Lists.reverse(numberList).forEach(System.out::println);
}
cs
 
⑤ transform
 
1
2
3
4
5
@Test
public void test_transform() {
    List<Integer> numberList = Lists.newArrayList(123456789);
    Lists.transform(numberList, value -> value * 2).forEach(System.out::println);
}
cs
 
7) Math
 
- XXXXMath Class가 존재하여, 각 형식에 맞게 변환 가능합니다.
- RoundingMode로 올림/반올림/내림 등의 처리 가능합니다.
 
1
2
3
4
5
6
7
8
9
10
@Test
public void test_checkedMultiply() throws Exception {
    try {
        IntMath.checkedMultiply(1 * 10000 * 10000100);
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
 
    Assert.assertTrue(true);
}
cs
 
 
참고
 
 


'java' 카테고리의 다른 글

Lombok - 간략 정리  (416) 2017.06.01
Thread Pool 이해하기  (401) 2017.04.01
Java - Garbage First(G1) Garbage Collection  (417) 2017.03.12
Java - JVM Architecture  (429) 2017.03.08
Java - Compare GC  (406) 2017.03.07
Comments