覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Guava 21.0 がリリースされてた

Guavaの21.0がいつの間にかリリースされてました。

Release21 · google/guava Wiki · GitHub


今回からJava8必須になったようです。

色々変更があったようなので簡単に(ごく一部を)試してみます。


準備

pom.xmlに以下を追記します

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>21.0</version>
</dependency>


com.google.common.base.Optional

Java標準のOptional(java.util.Optional)との相互変換ができるようになっています。

  • Optional#toJavaUtil : GuavaのOptional -> java.util.Optional の変換を行います。
  • Optional#fromJavaUtil : java.util.Optional -> GuavaのOptional の変換を行います。


■サンプルコード

import com.google.common.base.Optional;

Optional guavaOpt1 = Optional.of("Some");

// Guava -> Java
java.util.Optional javaOpt = guavaOpt1.toJavaUtil();

// Java -> Guava
Optional guavaOpt2 = Optional.fromJavaUtil(javaOpt);


com.google.common.collect.Multimap

MultimapにforEachメソッドがいくつか追加されています

  • Multimap#foreach : Multimap内の(重複keyも含めた)全要素に対する処理を行うことができます。(引数にはkeyとvalueが渡されます)


■サンプルコード

import com.google.common.collect.Multimap;
import com.google.common.collect.ArrayListMultimap;

Multimap<String, String> multiMap = ArrayListMultimap.create();
multiMap.put("key1", "value1");
multiMap.put("key1", "value2");
multiMap.put("key1", "value3");
multiMap.put("key2", "data1");
multiMap.put("key3", "Taro");

// 引数にはkeyとvalueが渡される
System.out.println("## Multimap#foreach");
multiMap.forEach((k, v) -> System.out.println(k + ": " + v));

■実行結果

## Multimap#foreach
key1: value1
key1: value2
key1: value3
key2: data1
key3: Taro


com.google.common.collect.Multiset

Multisetにメソッドがいくつか追加されています

  • Multiset#foreach : Multiset内の(重複要素も含めた)全要素に対する処理を行うことができます。
  • Multiset#forEachEntry : Multiset内の各エントリに対する処理を行うことができます。エントリとして要素とその保持数が引数に渡されます
  • Multiset#size : Multiset内の(重複要素も含めた)全要素を取得することができます。


■サンプルコード

import com.google.common.collect.Multiset;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Lists;

List<String> words = Lists.newArrayList("hello", "dog", "cat", "red", "hello", "hello", "dog", "blue", "blue");

Multiset<String> wordMultiSet = HashMultiset.create(words);

System.out.println("## Multiset#foreach");
wordMultiSet.forEach(e -> System.out.println(e));

System.out.println("\n");

System.out.println("## Multiset#forEachEntry");
wordMultiSet.forEachEntry((e, count) -> System.out.println(e + ":" + count));

System.out.println("\n");

System.out.println("## Multiset#size");
System.out.println("size : " + wordMultiSet.size());

■実行結果

## Multiset#foreach
red
blue
blue
cat
hello
hello
hello
dog
dog


## Multiset#forEachEntry
red:1
blue:2
cat:1
hello:3
dog:2


## Multiset#size
size : 9


com.google.common.collect.Streams

新しく追加されたクラスです、Stream APIにはない補助的なメソッドを提供してくれています

  • Streams#zip : 指定された2つのStream内の要素同士を合成することができます。
  • Streams#concat : 指定された複数のStreamを結合したStreamを返します。
  • Streams#findLast : Streamの内の最終要素をjava.util.Optionalで返します。


■サンプルコード

import com.google.common.collect.Streams;

List<Integer> list1 = Arrays.asList(0, 1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(12, 13, 14, 15, 16, 17);

List<Integer> zippedList =
        Streams.zip(list1.stream(), list2.stream(), (i1, i2) -> i1 + i2)
            .collect(Collectors.toList());

System.out.println("Streams#zip List: " + zippedList);


List<Integer> concatList = Streams.concat(list2.stream(), list1.stream())
        .collect(Collectors.toList());

System.out.println("Streams#concat List: " + concatList);


java.util.Optional<Integer> last = Streams.findLast(list1.stream());
last.ifPresent(val -> System.out.println("list1 last -> " +val));

■実行結果

Streams#zip List: [12, 14, 16, 18, 20, 22]
Streams#concat List: [12, 13, 14, 15, 16, 17, 0, 1, 2, 3, 4, 5]
list1 last -> 5



関連エントリ