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<String, String> 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<String, String> map = Maps.newHashMap(); map.put("key", "param"); map.put("key2", "param2"); Map<String, String> 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(1, 2, 3, 4, 5); | 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(1, 2, 3, 4, 5, 6, 7, 8, 9).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(1, 2, 3, 4, 5, 6, 7, 8, 9); 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(1, 2); List<Integer> numberList2 = Lists.newArrayList(3, 4); 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(1, 2, 3, 4, 5, 6, 7, 8, 9); Lists.reverse(numberList).forEach(System.out::println); } | cs |
⑤ transform
1 2 3 4 5 | @Test public void test_transform() { List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9); 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 * 10000, 100); } catch (ArithmeticException e) { e.printStackTrace(); } Assert.assertTrue(true); } | cs |
참고