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クラスは、Iterable、Iterator、Optional、および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クラスは、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 concatenatedStreams = Streams.concat(streamFromCollection, streamFromIterable,streamFromIterator);
concat機能には、LongStream、IntStream、および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()メソッドは、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″,”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にあります。