1概要


Google Guava

は、Java開発を容易にするユーティリティをライブラリに提供します。このチュートリアルではhttps://github.com/google/guava/wiki/Release18[Guava 18 release]で導入された新機能を見ていきます。


2

MoreObjects

ユーティリティクラス

Guava 18では、

java.util.Objects

に同等のものがないメソッドを含む

MoreObjects

クラスが追加されました。

リリース18の時点では、

toStringHelper

メソッドの実装のみが含まれています。これは、独自の

toString

メソッドを構築するのに役立ちます。


  • toStringHelper(Class <?> clazz)


  • toStringHelper(オブジェクト自身)


  • toStringHelper(String className)

通常、

toString()

は、オブジェクトに関する情報を出力する必要があるときに使用されます

__.


通常、オブジェクトの現在の状態に関する詳細が含まれているはずです。

toStringHelper

の実装の1つを使用することで、便利な

toString()__メッセージを簡単に作成できます。


toString()が呼び出されたときに書き込む必要があるいくつかのフィールドを含む

User

オブジェクトがあるとします。これを簡単に行うために

MoreObjects.toStringHelper(Object self)__メソッドを使用できます。

public class User {

    private long id;
    private String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this)
            .add("id", id)
            .add("name", name)
            .toString();
    }
}

ここでは

toStringHelper(Object self)

メソッドを使用しました。このセットアップでは、

toString()

を呼び出したときに出力される結果を確認するためのサンプルユーザーを作成できます。

User user = new User(12L, "John Doe");
String userState = user.toString();//userState: User{ id=12,name=John Doe }

他の2つの実装は、同様に設定されている場合、同じ

String

を返します。


  • toStringHelper(Class <?> clazz)

    **

@Override
public String toString() {
    return MoreObjects.toStringHelper(User.class)
        .add("id", id)
        .add("name", name)
        .toString();
}


  • toStringHelper(String className)

    **

@Override
public String toString() {
    return MoreObjects.toStringHelper("User")
        .add("id", id)
        .add("name", name)
        .toString();
}

これらのメソッドの違いは、

User

クラスの拡張で

toString()

を呼び出す場合に明らかです。たとえば、

Administrator



Player

の2種類の

__User

__がある場合、それらは異なる出力を生成します。

public class Player extends User {
    public Player(long id, String name) {
        super(id, name);
    }
}

public class Administrator extends User {
    public Administrator(long id, String name) {
        super(id, name);
    }
}


User

クラスで

toStringHelper(Object self)

を使用すると、

Player.toString()

は“

Player \ {id = 12、name = John Doe}

”を返します。

ただし、

toStringHelper(String className)

または

toStringHelper(Class <?> clazz)

を使用した場合、

Player.toString()

は“

User \ {id = 12、name = John Doe}

”を返します。リストされているクラス名は、サブクラスではなく親クラスになります。


3

FluentIterable


の新しいメソッド


3.1. 概要


FluentIterable

は、

Iterable

インスタンスを連鎖的に扱うために使用されます。使い方を見てみましょう。

上記の例で定義した

User

オブジェクトのリストがあり、そのリストをフィルタリングして18歳以上のユーザーだけを含めるとします。

List<User> users = new ArrayList<>();
users.add(new User(1L, "John", 45));
users.add(new User(2L, "Michelle", 27));
users.add(new User(3L, "Max", 16));
users.add(new User(4L, "Sue", 10));
users.add(new User(5L, "Bill", 65));

Predicate<User> byAge = user -> user.getAge() >= 18;

List<String> results = FluentIterable.from(users)
                           .filter(byAge)
                           .transform(Functions.toStringFunction())
                           .toList();

結果のリストには、John、Michelle、およびBillの情報が含まれます。


3.2.

FluentIterable.of(E[])


この方法では。

Object

の配列から

FluentIterable

を作成できます。

User[]usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) } ;
FluentIterable<User> users = FluentIterable.of(usersArray);

これで、

FluentIterable

インターフェースで提供されているメソッドを使用できます。


3.3.

FluentIterable.append(E …​)


さらに

FluentIterable

を追加することで、既存の

FluentIterable

から新しい

FluentIterable

を作成できます。

User[]usersArray = {new User(1L, "John", 45), new User(2L, "Max", 15)};

FluentIterable<User> users = FluentIterable.of(usersArray).append(
                                 new User(3L, "Sue", 23),
                                 new User(4L, "Bill", 17)
                             );

予想通り、結果の

FluentIterable

のサイズは4です。


3.4.

FluentIterable.append(Iterable <?extends E>)


このメソッドは前の例と同じように動作しますが、

Iterable

の既存の実装の内容全体を

FluentIterable

に追加できます。

User[]usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) };

List<User> usersList = new ArrayList<>();
usersList.add(new User(3L, "Diana", 32));

FluentIterable<User> users = FluentIterable.of(usersArray).append(usersList);

予想どおり、結果の

FluentIterable

のサイズは3です。


3.5.

FluentIterable.join(ジョイナー)



FluentIterable.join(…​)

メソッドは、指定された

String

で結合された

FluentIterable

の内容全体を表す

String

を生成します。

User[]usersArray = { new User(1L, "John", 45), new User(2L, "Max", 15) };
FluentIterable<User> users = FluentIterable.of(usersArray);
String usersString = users.join(Joiner.on("; "));


usersString

変数には、「;」で区切られた

FluentIterable

の各要素で

toString()

メソッドを呼び出した結果が含まれます。

Joiner

クラスは文字列を結合するためのいくつかのオプションを提供します。


4

Hashing.crc32c


ハッシュ関数は、任意のサイズのデータ​​を固定サイズのデータ​​にマップするために使用できる関数です。暗号化や送信データのエラーチェックなど、さまざまな分野で使用されています。


Hashing.crc32c

メソッドはhttps://en.wikipedia.org/wiki/Cyclic

redundancy

check[CRC32Cアルゴリズム]を実装する

HashFunction

を返します。

int receivedData = 123;
HashCode hashCode = Hashing.crc32c().hashInt(receivedData);//hashCode: 495be649


5

InetAddresses.decrement(InetAddress)


このメソッドは、新しい

InetAddress

を返します。これは、入力よりも「1つ少ない」ものになります。

InetAddress address = InetAddress.getByName("127.0.0.5");
InetAddress decrementedAddress = InetAddresses.decrement(address);//decrementedAddress: 127.0.0.4

** 6. __MoreExecutorsの新しいエグゼキュータ

__ **


6.1. スレッディングレビュー

Javaでは、作業を実行するために複数のスレッドを使用できます。この目的のために、Javaには

Thread

クラスと

Runnable

クラスがあります。

ConcurrentHashMap<String, Boolean> threadExecutions = new ConcurrentHashMap<>();
Runnable logThreadRun = () -> threadExecutions.put(Thread.currentThread().getName(), true);

Thread t = new Thread(logThreadRun);
t.run();

Boolean isThreadExecuted = threadExecutions.get("main");

予想どおり、

isThreadExecuted



true

になります。また、この

Runnable



main

スレッドでのみ実行されることがわかります。複数のスレッドを使用したい場合は、目的に応じて異なる

Executors

を使用できます。

ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(logThreadRun);
executorService.submit(logThreadRun);
executorService.shutdown();

Boolean isThread1Executed = threadExecutions.get("pool-1-thread-1");
Boolean isThread2Executed = threadExecutions.get("pool-1-thread-2");//isThread1Executed: true//isThread2Executed: true

この例では、送信されたすべての作業は

ThreadPool

スレッドで実行されます。

Guavaは、その

MoreExecutors

クラスでさまざまなメソッドを提供しています。


6.2.

MoreExecutors.directExecutor()


これは、

execute

メソッドを呼び出すスレッド上でタスクを実行できる軽量のexecutorです。

Executor executor = MoreExecutors.directExecutor();
executor.execute(logThreadRun);

Boolean isThreadExecuted = threadExecutions.get("main");//isThreadExecuted: true


6.3.

MoreExecutors.newDirectExecutorService()


このメソッドは

ListeningExecutorService

のインスタンスを返します。これは

Executor

のより重い実装で、多くの便利なメソッドがあります。これは、以前のバージョンのGuavaから廃止予定の

sameThreadExecutor()

メソッドに似ています。

この

ExecutorService

は、

execute()

メソッドを呼び出すスレッドでタスクを実行します。

ListeningExecutorService executor = MoreExecutors.newDirectExecutorService();
executor.execute(logThreadRun);

このexecutorには、

invokeAll、invokeAny、awaitTermination、submit、isShutdown、isTerminated、shutdown、shutdownNow

などの便利なメソッドが多数あります。


7. 結論

Guava 18では、増え続ける便利な機能のライブラリにいくつかの追加と改良が加えられました。それはあなたの次のプロジェクトで使うために検討する価値があります。この記事のコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/guava-modules/guava-18[GitHubレポジトリ]にあります。