Guava21の新しいストリーム、コンパレータ、コレクタ
1. 序章
この記事は、GoogleGuavaライブラリのバージョン21でリリースされた新機能に関するシリーズの最初の記事です。 新しく追加されたクラスと、以前のバージョンのGuavaからのいくつかの主要な変更について説明します。
具体的には、common.collectパッケージの追加と変更について説明します。
Guava 21では、common.collectパッケージにいくつかの新しい便利な機能が導入されています。 これらの新しいユーティリティのいくつかと、それらを最大限に活用する方法を簡単に見てみましょう。
2. ストリーム
Java8に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 クラスは、 オプションダブル、オプションロング、およびオプションIntのフレーバーも提供します。 これらのメソッドは、その要素のみを含むストリームを返します。それ以外の場合は空のストリームを返します。
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″、 “chocolate:$ 2″、 “bar:$ 3″);が返されます。
結果のストリームは、2つの入力ストリームのうち短い方の長さだけになります。 1つのストリームが長い場合、その余分な要素は無視されます。
3. コンパレータ
Guava Ordering クラスは非推奨であり、新しいバージョンでは削除の段階にあります。 Ordering クラスのほとんどの機能は、すでにJDK8に登録されています。
Guavaはコンパレータを導入して、Java8標準ライブラリではまだ提供されていないOrderingの追加機能を提供します。
これらを簡単に見てみましょう。
3.1. Comparisons.isInOrder()
このメソッドは、コンパレータで指定されているように、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. Comparisons.isInStrictOrder()
isInOrder()メソッドと非常によく似ていますが、条件を厳密に保持します。要素は前の要素と等しくすることはできず、より大きい必要があります。 前のコードは、このメソッドに対してfalseを返します。
3.3. Comparisons.lexicographical()
このAPIは、新しいコンパレータインスタンスを返します。これは、対応する要素をペアごとに比較する辞書式(辞書)順序で並べ替えます。 内部的には、の新しいインスタンスを作成します LexicographicalOrdering () 。
4. MoreCollectors
MoreCollectors には、Java 8 java.util.stream.Collectors には存在せず、com.googleに関連付けられていない非常に便利なCollectorsが含まれています。 commonタイプ。
これらのいくつかを見てみましょう。
4.1. MoreCollectors.toOptional()
ここで、 Collector は、0個または1個の要素を含むストリームをオプションに変換します。
List<Integer> numbers = Arrays.asList(1);
Optional<Integer> number = numbers.stream()
.map(e -> e * 2)
.collect(MoreCollectors.toOptional());
ストリームに複数の要素が含まれている場合–コレクターはスローします
4.2。MoreCollectors.onlyElement()
このAPIを使用すると、 Collector は1つの要素のみを含むストリームを取得し、その要素を返します。 ストリームに複数の要素が含まれている場合はIllegalArgumentExceptionをスローし、ストリームにゼロの要素が含まれている場合はNoSuchElementExceptionをスローします。
5. Interners.InternerBuilder
これは、Guavaライブラリにすでに存在するInternersの内部ビルダークラスです。 それはあなたが好むインターネットの並行性レベルとタイプ(弱いまたは強い)を定義するためのいくつかの便利な方法を提供します:
Interners interners = Interners.newBuilder()
.concurrencyLevel(2)
.weak()
.build();
6. 結論
このクイック記事では、Guava21のcommon.collectパッケージに新しく追加された機能について説明しました。
この記事のコードは、いつものようにGithubにあります。