Java – Stream API

今回は、Java 8から追加されたStream APIについて簡略にみていきたいと思います。

Streamとは

様々なデータを標準化された方法で扱うためのライブラリです。

  • streamを生成:stream()
  • 中間操作:filter、map、flatMapなど
  • 終端操作:count、forEach、sumなど

の流れでおこないます。

Streamの種類

 Stream <T> 汎用的のStream 
 IntStream値のタイプがIntのStream
 LongStream 値のタイプがLongのStream
 DoubleStream 値のタイプがDoubleのStream

Streamの中間操作

 Stream < T > distinct() Streamの要素の重複を除外
 Stream < T > sorted()  Streamの要素のソートを行う
 Stream < T > filter(Predicate < T > predicate)条件に該当する要素をStreamに生成する
 Stream < T > limit(long maxSize) maxSizeまでの要素をStreamに生成する
 Stream < T > skip(ling n)最初からn個の要素を除外したstreamを生成
 Stream < T > peek(Consumer< T > action)Tタイプの要素に合う作業を行う。
 Stream < R > flatMap(Function< T, stream<? extends R>> Tmapper)Tタイプの要素を 1:NのRタイプの要素に変換してstreamを生成する
 Stream < R > map(Function<? super T, ? extends R> mapper) TタイプをRタイプ要素に変換してstreamを生成
 Stream mapToInt(),mapToLong(),mapToDobule()もしmap Typeが数字ではない場合に変換して使う

Streamの終端操作

 void forEach(Consumer <? super T> action) Streamの各要素に指定された作業を行う。(拡張Forと似ている)
 long count() Streamの要素を返却する
 Optional < T > sum (Comparator <? super T> comparator) Streamの要素の合計
 Optional < T > max (Comparator <? super T> comparator) Streamの要素の最大値
 Optional < T > min (Comparator <? super T> comparator) Streamの要素の最小値
 Optional < T > findAny() Streamの要素のランダム要素を返却
 Optional < T > findFirst() Streamの要素の1番目の要素を返却
 boolean allMatch(Pradicate < T > p) Streamの値が全て満足しているかを返却
 boolean anyMatch(Pradicate < T > p) Streamの値が1つでも満足しているかを返却
 boolean noneMatch(Pradicate < T > p) Streamの値が1つでも満足していないかを返却 
 Object[] toArray() Streamの全ての要素を配列に返却

mapとflatMapの違い

map(T -> R)は、Tのデータ型をRのデータ型に1:1の変換です。
 ・flatMap(T -> Stream<R>)は、Tのデータ型からStream<R>に1:Nの変換です。

Stream#map()

List<String> nameList = Arrays.asList("Tanaka", "Suzuki", "Takahashi");
Stream<Integer> stream = nameList.stream().map(x -> x.length());
System.out.println(stream.collect(Collectors.toList())); // [6, 6, 9]

TanakaSuzukiTakahashi
669

上記のように文字列(String)から文字列長(Integer)へ1:1の変換です。

Stream#flatMap()

List<String> nameList = Arrays.asList("Tanaka", "Suzuki", "Takahashi");
Stream<Object> stream = nameList.stream().flatMap(x -> Stream.of(x, x.length()));
System.out.println((stream.collect(Collectors.toList())));
// [Tanaka, 6, Suzuki, 6, Takahashi, 9]

TanakaSuzukiTakahashi
Tanaka, 6Suzuki, 6Takahashi, 9

文字列(String)から[文字列(String), 文字列長(Integer)]へ1:Nの変換です。
但し、その場合は2次元配列が生成されるわけではなく、flatなStreamが返却されます。

参考

https://qiita.com/KevinFQ/items/97137efb2159009b60e1

コメントを残す