ストリーム(Stream)


05.ストリーム(Stream)


Streamとは?


  • データの目標を考慮せずに同じ計算を実行
    配列、コレクションの演算
    一貫した計算によりデータ処理が簡素化
    データ処理の抽象化を実施した

  • 作成および使用できないストリーム
    データ・ストリームを作成し、演算を実行すると、データ・ストリームが消費されます.
    ストリームを再作成して他の演算を実行する必要があります

  • フロー計算では既存の資料は変更されません
    データ・ストリームを作成すると、データ・ストリームで使用されるメモリ領域が個別に作成されるため、演算時に既存のデータは変更されません.

  • ストリーム演算は中間演算と最終演算に分けられる
    複数の中間演算を対流で適用できますが、最終演算は1回のみ適用されます.
    最終演算が呼び出された場合にのみ、中間演算が実行され、結果が生成されます.
    したがって,中間演算の結果は演算中に未知である.
    ちえんえんざん
  • フローの作成と使用


  • は、整数配列にストリームを作成することによって演算を実行する
    package me.sungbin.chapter6.ch06_04;
    
    import java.util.Arrays;
    import java.util.stream.IntStream;
    
    public class IntArrayStreamTest {
        public static void main(String[] args) {
    
            int[] arr = {1, 2, 3, 4, 5};
    
            for (int num : arr) {
                System.out.println(num);
            }
            System.out.println();
    
            IntStream is = Arrays.stream(arr);
            is.forEach(System.out::println);
    
            int sum = Arrays.stream(arr).sum();
            System.out.println(sum);
        }
    }
    

    中間演算と最終演算


  • 中間演算例-filter()、map()、sorded()など
    条件を満たす要素(map)を抽出(フィルタ)または変換する

  • 最終演算の呼び出し時に中間演算を実行し、結果を生成

  • 文字列リストの文字列長が5より大きい要素のみを出力します.
  •   sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
    filter()は中間演算、forEach()は最終演算
  • 顧客カテゴリからのみ顧客名
  • を取得する.
      customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));
    map()は中間演算、forEach()は最終演算

  • 中間演算と最終演算の実現はランム多式を用いる

  • 最終演算例-forEach()、count()、sum()など.
    ストリーム管理のデータが次々と消費され、演算が実行される
    最終演算後、ストリームは他の演算を適用できません.
    forEach():要素を1つずつ抽出
    count():要素の数
    sum():要素の和
  • ArrayListオブジェクトでのフローの作成と使用

  • ArrayListに文字列(名前)を入力し、複数の演算を実行
    package me.sungbin.chapter6.ch06_04;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Stream;
    
    public class ArrayListStreamTest {
        public static void main(String[] args) {
    
            List<String> sList = new ArrayList<>();
            sList.add("Tomas");
            sList.add("Edward");
            sList.add("Robert");
    
            Stream<String> stream = sList.stream();
            stream.forEach(System.out::println);
    
            sList.stream().sorted().forEach(s -> System.out.print(s + "\t"));
            System.out.println();
            sList.stream().map(String::length).forEach(n -> System.out.print(n + "\t"));
            System.out.println();
            sList.stream().filter(s -> s.length() > 5).forEach(n -> System.out.print(n + "\t"));
    
        }
    }
    

  • 新しい計算を実行するには、既存のストリームを繰り返し使用するのではなく、stream()メソッドを呼び出してストリームを再作成する必要があります.

  • 整数データの複数の演算例
  • public class IntArrayStreamTest {
    
    	public static void main(String[] args) {
    		int[] arr = {1,2,3,4,5};
    		Arrays.stream(arr).forEach(n->System.out.print(n + "\t"));
    		System.out.println();
    					
    		int sum  = Arrays.stream(arr).sum();
    		System.out.println("sum: " + sum);
    		
    		List<Integer> list = new ArrayList<Integer>();
    		list.add(1);
    		list.add(2);
    		list.add(3);
    		list.add(4);
    		list.add(5);
    		int sum2 = list.stream().mapToInt(n->n.intValue()).sum();
    		System.out.println(sum2);
    	}
    
    }