はじめに
今回は、javaの「Stream」メソッドについて勉強したことを記載していきたいと思います。
Streamとは
Streamとは、ListやMap・Setなどのコレクションに対して、様々な処理をラムダ式を使用して簡潔に記述することを可能にしたメソッドのことです。
定義
Streamは、ListやMap・Setのコレクションに用意されている「Stream」メソッドを呼び出す、またはStreamクラスを生成することで使用することができます。
// コレクションに用意されているメソッドの呼び出し
コレクション.Stream();
// Streamクラスの生成
Stream<String> 変数名 = コレクション.stream();
Stream<String> 変数名 = Stream.of("要素1", "要素2");
// 数値の扱い
IntStream 変数名 = コレクション.stream();
IntStream 変数名 = Stream.of("要素1", "要素2");
例
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// オブジェクトの扱い
List<String> list = new ArrayList<>();
list.add("Test");
Stream<String> stream1 = list.stream();
Stream<String> stream2 = Stream.of("TEST", "TEST2");
stream1.forEach(System.out::println);
stream2.forEach(System.out::println);
// 数値の扱い
IntStream stream3 = IntStream.of(1,2,3);
stream3.forEach(System.out::println);
}
Streamの操作メソッドについて
Streamを操作するメソッドには、「中間操作メソッド」と「終端操作メソッド」が用意されています。
中間操作:Streamに対して変換等の中間的な操作を加える
終末操作:Streamに対して値の取り出し等、最終的な操作を実施する
中間操作
メソッド | 内容 |
filter | 要素にフィルターをかける |
map | 要素の変換をする |
mapToInt | 要素をint型に変換しIntStreamを返却する |
mapToDouble | 要素をdouble型に変換しDoubleStreamを返却する |
mapToLong | 要素をlong型に変換しLongStreamを返却する |
flatMap | 要素の変換をする |
distinct | 要素の重複を排除する |
sorted | 要素をソートする |
skip | 要素を指定した数、先頭からスキップする |
limit | 要素を先頭から指定した数まで返却する |
filter
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
// Bを含む文字列かでフィルター
list = list.stream().filter(x -> x.contains("B")).toList();
list.forEach(System.out::println);
}
map
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.stream().map(x -> x.length()).forEach(System.out::println);
List<String> list2 = new ArrayList<>();
list2.add("100");
list2.add("200");
list2.add("300");
IntStream stream = list2.stream().mapToInt(Integer::parseInt);
stream.forEach(System.out::println);
}
distinct
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.stream().distinct().forEach(System.out::println);
}
sorted
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestF");
list.add("TestD");
// 自然順序でソート
list.stream().sorted().forEach(System.out::println);
List<Integer> list2 = new ArrayList<>();
list2.add(200);
list2.add(100);
list2.add(500);
list2.add(600);
list2.add(300);
// 昇順
list2.stream().sorted(Comparator.naturalOrder()).forEach(System.out::println);
// 降順
list2.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);
}
skip
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestD");
list.add("TestE");
// 1,2個目の要素をスキップする
list.stream().skip(2).forEach(System.out::println);
}
limit
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestD");
list.add("TestE");
// 1,2個目まで要素を取得する
list.stream().limit(2).forEach(System.out::println);
}
終端操作
メソッド | 内容 |
forEach | 要素を繰り返し処理する |
allMatch | すべての要素が条件を満たす場合true |
anyMatch | 要素が1つでも条件を満たす場合true |
noneMatch | 要素が1つでも条件を満足さない場合true |
findAny | Streamの結果から何か1つ返却 |
findFirst | Streamの結果から最初の内容を返却 |
sum | 要素を合計する |
max | 要素の最大値を返却する |
min | 要素の最小値を返却する |
forEach
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.stream().forEach(System.out::println);
}
Match
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestD");
list.add("TestE");
// すべて一致する場合true
System.out.println(list.stream().allMatch(x -> x.startsWith("T")));
// 1つても一致する場合true
System.out.println(list.stream().anyMatch(x -> x.startsWith("T")));
// 1つも条件を満たさない場合true
System.out.println(list.stream().noneMatch(x -> x.startsWith("T")));
}
find
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list = new ArrayList<>();
list.add("TestA");
list.add("TestB");
list.add("TestC");
list.add("TestD");
System.out.println(list.stream().findAny().toString());
System.out.println(list.stream().findFirst().toString());
}
sum,min,max
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
List<String> list2 = new ArrayList<>();
list2.add("100");
list2.add("200");
list2.add("300");
IntStream stream = list2.stream().mapToInt(Integer::parseInt);
System.out.println(stream.sum());
System.out.println(list2.stream().max(Comparator.naturalOrder()));
System.out.println(list2.stream().min(Comparator.naturalOrder()));
}
ドキュメント
【公式ドキュメント】
Java SE Specifications (oracle.com)
最後に
Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)
以上、ログになります。
これからも継続していきましょう!!
コメント