1.




はじめに


この記事は、Google Guavaライブラリのバージョン21で開始された新機能に関するシリーズの最初の記事です。新しく追加されたクラスと、以前のバージョンのGuavaからの主な変更点について説明します。

具体的には、

common.collect

パッケージの追加と変更について説明します。

Guava 21では、

common.collect

パッケージに新しく便利な機能がいくつか導入されています。これらの新しいユーティリティのいくつかと、それらを最大限に活用する方法を簡単に見てみましょう。


2

Streams


Java 8に

java.util.stream.Stream

が最近追加されたことを私たち全員が興奮しています。さて、Guavaは現在ストリームをうまく利用しており、Oracleが見逃している可能性があるものを提供しています。


Streams

は静的なユーティリティクラスです。Java8ストリームを処理するために必要なユーティリティがいくつかあります。


2.1.

Streams.stream()



Streams

クラスは、

Iterable



Iterator



Optional

、および

Collection

を使用してストリームを作成する4つの方法を提供します。

ただし、

Collection

を使用したスト​​リームの作成は、Java 8で提供されているため、推奨されません。

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Stream<Integer> streamFromCollection = Streams.stream(numbers);
Stream<Integer> streamFromIterator = Streams.stream(numbers.iterator());
Stream<Integer> streamFromIterable = Streams.stream((Iterable<Integer>) numbers);
Stream<Integer> streamFromOptional = Streams.stream(Optional.of(1));


Streams

クラスは、

OptionalDouble



OptionalLong

、および

OptionalInt

のフレーバーも提供します。これらのメソッドは、その要素のみを含むストリームを返します。それ以外の場合は空のストリームです。

LongStream streamFromOptionalLong = Streams.stream(OptionalLong.of(1));
IntStream streamFromOptionalInt = Streams.stream(OptionalInt.of(1));
DoubleStream streamFromOptionalDouble = Streams.stream(OptionalDouble.of(1.0));


2.2.

Streams.concat()



Streams

クラスは、複数の同種ストリームを連結するためのメソッドを提供します。

Stream<Integer> concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable,streamFromIterator);


concat

機能にはいくつかの種類があります –

LongStream



IntStream

、および

DoubleStream


2.3.

Streams.findLast()



Streams

には、

findLast()

メソッドを使用してストリーム内の最後の要素を見つけるためのユーティリティメソッドがあります。

このメソッドは最後の要素を返すか、ストリームに要素がない場合は

Optional.empty()

を返します。

List<Integer> integers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Optional<Integer> lastItem = Streams.findLast(integers.stream());


findLast()

メソッドは、

LongStream



IntStream

、および

DoubleStream

に対して機能します。


2.4.

Streams.mapWithIndex()



mapWithIndex()

メソッドを使用することにより、ストリームの各要素はそれぞれの位置(インデックス)に関する情報を保持します。

mapWithIndex( Stream.of("a", "b", "c"), (str, index) -> str + ":" + index)

これは

Stream.of( “a:0 ”、” b:1 ”、 “c:2″)

を返します。

オーバーロードされた

mapWithIndex()を使用して

IntStream



LongStream

、および

DoubleStream__を使用しても同じことが実現できます。


2.5.

Streams.zip()


ある関数を使って2つのストリームの対応する要素をマッピングするためには、__Streamsのzipメソッドを使うだけです。

Streams.zip(
  Stream.of("candy", "chocolate", "bar"),
  Stream.of("$1", "$2","$3"),
  (arg1, arg2) -> arg1 + ":" + arg2
);

これは__Stream.of( “candy:$ 1 ”、チョコレート:$ 2 ”、” bar:$ 3 “)を返します。

結果のストリームは、2つの入力ストリームのうち短い方のストリームと同じ長さになります。 1つのストリームが長い場合、その余分な要素は無視されます。


3

コンパレータ


Guava

Ordering

クラスは推奨されておらず、新しいバージョンでは削除の段階にあります。

Ordering

クラスの機能の大部分はすでにJDK 8に参加しています。

Guavaは、Java 8標準ライブラリではまだ提供されていない

Ordering

の追加機能を提供するために

Comparators

を導入します。

これらを簡単に見てみましょう。


3.1.

Comparators.isInOrder()


このメソッドは、

Comparator

で指定されているように、Iterable内の各要素が前の要素以上の場合にtrueを返します。

List<Integer> integers = Arrays.asList(1,2,3,4,4,6,7,8,9,10);
boolean isInAscendingOrder = Comparators.isInOrder(
  integers, new AscedingOrderComparator());


3.2.

Comparators.isInStrictOrder()



isInOrder()

メソッドと非常に似ていますが、それは厳密に条件を保持し、要素は前のものと等しくなることはできません、それはより大きくなければなりません。前のコードはこのメソッドに対してfalseを返します。


3.3.

Comparators.lexicographical()


このAPIは新しい

Comparator

インスタンスを返します。これは、対応する要素をペアごとに比較して辞書順(辞書)の順序でソートします。内部的には、

LexicographicalOrdering <S>()

の新しいインスタンスを作成します。


4

その他のコレクター



MoreCollectors

には、Java 8

java.util.stream.Collectors

には存在せず、

com.google.common

タイプに関連付けられていない、非常に便利な

Collectors

がいくつか含まれています。

これらのいくつかを見てみましょう。


4.1.

MoreCollectors.toOptional()


ここで、

Collector

は、0個または1個の要素を含むストリームを

Optional

に変換します。

List<Integer> numbers = Arrays.asList(1);
Optional<Integer> number = numbers.stream()
  .map(e -> e **  2)
  .collect(MoreCollectors.toOptional());

ストリームに複数の要素が含まれている場合、コレクタは

IllegalArgumentExceptionをスローします。


4.2.

MoreCollectors.onlyElement()


このAPIでは、

Collector

は要素を1つだけ含むストリームを受け取り、その要素を返します。ストリームに複数の要素が含まれている場合は

IllegalArgumentException

がスローされ、ストリームに要素が含まれていない場合は

NoSuchElementException

がスローされます。


5

Interners.InternerBuilder


これは、Guavaライブラリに既に存在する

Interners

の内部ビルダークラスです。それはあなたが好む

Interner

の並行性レベルとタイプ(弱いか強い)を定義するための便利な方法を提供します。

Interners interners = Interners.newBuilder()
  .concurrencyLevel(2)
  .weak()
  .build();


6. 結論

このクイック記事では、Guava 21の

common.collect package

に新しく追加された機能について説明しました。

この記事のコードは、いつものようにhttps://github.com/eugenp/tutorials/tree/master/guava-modules/guava-21[Github]にあります。