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());

ストリームに複数の要素が含まれている場合–コレクターはスローします IllegalArgumentException。

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にあります。