新しいストリーム、コンパレータ、およびコレクタin Guava 21

Guava 21の新しいストリーム、コンパレータ、コレクター

1. 前書き

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

具体的には、common.collectパッケージの追加と変更について説明します。

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

2. Streams

Java 8にjava.util.stream.Streamが最近追加されたことに私たちは皆興奮しています。 さて、グアバは現在ストリームをうまく利用しており、オラクルが見逃していたものを提供しています。

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

2.1. Streams.stream()

Streamsクラスは、IterableIteratorOptional、およびCollectionを使用してストリームを作成する4つの方法を提供します。

ただし、Collectionを使用したスト​​リームの作成は、Java 8によってすぐに提供されるため、非推奨です。

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

Streamsクラスは、OptionalDoubleOptionalLong、および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 concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable,streamFromIterator);

concat機能には、LongStreamIntStream、およびDoubleStreamのいくつかのフレーバーがあります。

2.3. Streams.findLast()

Streamsには、findLast()メソッドを使用してストリームの最後の要素を見つけるユーティリティメソッドがあります。

このメソッドは、最後の要素を返すか、ストリームに要素がない場合はOptional.empty()を返します。

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

findLast()メソッドは、LongStreamIntStream、および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()を使用して、IntStreamLongStream、および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″,”chocolate:$2″,”bar:$3”);を返します

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

3. Comparators

GuavaOrderingクラスは非推奨であり、新しいバージョンでは削除の段階にあります。 Orderingクラスの機能のほとんどは、すでにJDK8に参加しています。

GuavaはComparatorsを導入して、Java 8標準ライブラリではまだ提供されていないOrderingの追加機能を提供します。

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

3.1. Comparators.isInOrder()

このメソッドは、Comparatorで指定されているように、Iterableの各要素が前の要素以上の場合にtrueを返します。

List 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

MoreCollectorsには非常に便利なCollectorsが含まれており、Java 8java.util.stream.Collectorsには存在せず、com.google.common型には関連付けられていない。

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

4.1. MoreCollectors.toOptional()

ここで、Collectorは、0個または1個の要素を含むストリームをOptionalに変換します。

List numbers = Arrays.asList(1);
Optional 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に新しく追加された機能について説明しました。

この記事のコードは、いつものようにon Githubにあります。