Stream
StreamはJava8で導入された新しい記述方法です。
ラムダ式と組み合わせて、少ない記述で処理が書けるようになります。
Streamを使って、リストの中身を出力
リストなどに.stream()を付けるとストリームの処理を行うことができます。以下のサンプルでは、nullを外し、同じ値も外し、頭に"-"を付け、並び替え、頭の3データを出力しています。
import java.util.ArrayList;
import java.util.List;
public class Sort {
public static void main(String[] args) {
List<String> ary = new ArrayList<>();
ary.add("1");
ary.add("1");
ary.add("3");
ary.add("4");
ary.add(null);
ary.add("a");
ary.add("0");
ary.stream().filter(a -> a != null).distinct()
.map(b -> "-" + b).sorted().limit(3).forEach(System.out::println);
}
}
出力結果
-0
-1
-3
主なStreamでできる処理
メソッド | 説明 |
---|---|
filter | 条件に合わないデータを外す |
distinct | 同じデータを外す |
map | データを編集 |
sorted | ソートする。カッコの中に処理を書くことでソート条件を変えられる |
limit | 出力するデータを制限する |
forEach | for文で処理を回す。{}で複数行、処理が書ける。 |
System.out::println | メソッド参照。メソッドの引数が同じ場合、引数を省略できる。 |
Mapの場合
Mapの場合、entrySetを使用する。
import java.util.HashMap;
import java.util.Map;
public class Sort {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("a", "1");
map.put("b", null);
map.put("c", "3");
map.entrySet().stream().filter(ent -> ent.getValue() != null)
.forEach(ent -> System.out.println(ent.getKey() + "-" + ent.getValue()));
}
}
戻り地を戻す場合(終端処理)
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalDouble;
import java.util.Set;
import java.util.stream.Collectors;
public class Sort {
public static void main(String[] args) {
List<String> ary = new ArrayList<>();
ary.add("1");
ary.add("1");
ary.add("31");
ary.add("4");
// ループ(順番考慮なし)
ary.stream().forEach(a -> {
System.out.println("for:" + a);
});
// ループ(順番考慮あり)
ary.stream().forEachOrdered(a -> {
System.out.println("order:" + a);
});
// List作成
List<String> list = ary.stream().collect(Collectors.toList());
for (String str : list) {
System.out.println("list:" + str);
}
// Set作成
Set<String> set = ary.stream().collect(Collectors.toSet());
for (String str : set) {
System.out.println("set:" + str);
}
// Map作成
Map<String, Integer> map = ary.stream().collect(Collectors.toMap(a -> a, a -> a.length(), (b, a) -> a));
for (String key : map.keySet()) {
System.out.println("map:" + key + ":" + map.get(key));
}
// リスト数取得
long cnt = ary.stream().count();
System.out.println("count:" + cnt);
// 文字列連結
String str = ary.stream().collect(Collectors.joining("','", "{'", "'}"));
System.out.println(str);
// 最大取得
Optional<String> max = ary.stream().max((a, b) -> a.length() - b.length());
System.out.println("max:" + max.get());
// 最小取得
Optional<String> min = ary.stream().min(Comparator.comparing(String::length));
System.out.println("min:" + min.get());
// 合計取得
int sum = ary.stream().mapToInt(a -> Integer.parseInt(a)).sum();
System.out.println("sum:" + sum);
// 平均取得
OptionalDouble average = ary.stream().mapToInt(a -> Integer.parseInt(a)).average();
System.out.println("average:" + average.getAsDouble());
// 一つも合致
boolean anyMatch = ary.stream().anyMatch(a -> a.equals("31"));
System.out.println("anyMatch:" + anyMatch);
// すべて合致
boolean allMatch = ary.stream().allMatch(a -> a.length() > 0);
System.out.println("allMatch:" + allMatch);
// 一つも合致しない
boolean noneMatch = ary.stream().noneMatch(a -> a.length() > 3);
System.out.println("noneMatch:" + noneMatch);
}
}
for:1
for:1
for:31
for:4
order:1
order:1
order:31
order:4
list:1
list:1
list:31
list:4
set:1
set:4
set:31
map:1:1
map:4:1
map:31:2
count:4
{'1','1','31','4'}
max:31
min:1
sum:37
average:9.25
anyMatch:true
allMatch:true
noneMatch:true
ページのトップへ戻る