今回は、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]
| Tanaka | Suzuki | Takahashi |
|---|---|---|
| ↓ | ↓ | ↓ |
| 6 | 6 | 9 |
上記のように文字列(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]
| Tanaka | Suzuki | Takahashi |
|---|---|---|
| ↓ | ↓ | ↓ |
| Tanaka, 6 | Suzuki, 6 | Takahashi, 9 |
文字列(String)から[文字列(String), 文字列長(Integer)]へ1:Nの変換です。
但し、その場合は2次元配列が生成されるわけではなく、flatなStreamが返却されます。
