新しいストリーム、コンパレータ、およびコレクタin Guava 21
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]にあります。