トッカンソフトウェア

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



ページのトップへ戻る