Javaストリーム


りゅうしき


ストリーム=連続データ・アイテムのセットを一度に作成
Java 8から追加されたセットのストレージ要素は、ramda方式で処理される重複者を1つずつ参照します.
JAva 7以前のコード
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class ex {
    public static void main(String[] args) {

    List<String> list = Arrays.asList("이영진", "김영진");
    Iterator<String> iterator = list.iterator();

    while(iterator.hasNext()){
        String name= iterator.next();
        System.out.println(name);
    }

}
}

Java 8以降のコード
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class ex {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("이영진", "김영진");
        Stream<String> stream = list.stream();
        stream.forEach(name -> System.out.println(name));
        // 컬렉션의 요소를 하나씩 콘솔에 출력 
}
}
  • ラム茶式は元素処理コードを提供する.(Streamが提供する要素処理方法のほとんどは関数インタフェースパラメータを持つ)
  • 外部リピーター、内部リピーター


    がいぶ反復器
    =>開発者が直接コレクションの要素を繰り返す
    ex)for文、Ivalterrを用いたwhile文など
    ないぶ反復器
    =>コレクション内の要素の繰り返し

    内部重複者は、集合要素の重複を集合に渡すことができ、開発者は他のコードに集中することができます.
    並列作業を支援するため、要素を効率的に繰り返すことができます.
    開発者が直接元素を処理するのに比べて、I奇形器
    Streamはラムマルチ方式で要素処理内容のみを伝達し,繰り返しは集合内部で発生する.それだけでなく,要素の並列処理が可能であるという利点もある.

    ストリームの中間処理と最終処理


    しかしStreamにとって,処理は一度で簡単なものではない.
    データのフィルタリング、マッピング、ソート、パケットなどの中間処理.
    最終処理ライン(合計、平均、カウント、最大値、最小値など)で解決します.
    中間ストリームが形成されると、要素は直ちに中間処理(フィルタリング、マッピング、ソートなど)を行うのではなく、最適な処理が開始される前に中間処理が遅延する.
    Streamインタフェースには、フィルタリング、マッピング、ソートなど、多くの中間処理方法があります.
    これらのメソッドは、中間処理のストリームを返します.
    ex)会員集合では男性の中間ストリーム接続のみをフィルタリングし,男性年齢にマッピングされたストリームを接続し,最終男性の平均年齢を統計する.
    図とコードは以下の通りです.

    メンバークラス
    public class Member {
    
        public static int MALE =0;
        public static int FEMALE = 1;
        private String name;
        private int sex;
        private int age;
    
        public Member(String name, int sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }
    
        public int getSex() {
            return sex;
        }
    
        public int getAge() {
            return age;
        }
    }
    パイプライン
    
    List<Member> list = Arrays.asList(
                    new Member("이영진", Member.MALE, 30),
                    new Member("김영근", Member.MALE, 29),
                    new Member("이예지", Member.FEMALE, 24)
            );
    
            //람다이전의 코드 
    //        Stream<Member> maleFemaleStream = list.stream();
    //        Stream<Member> maleStream = maleFemaleStream.filter(m -> m.getSex() == Member.MALE);
    //        IntStream ageStream = maleStream.mapToInt(Member::getAge);
    //        OptionalDouble optionalDouble = ageStream.average();
    //        double ageAvg = optionalDouble.getAsDouble();
    //
            
            //자바8이후의 코드 
            double ageAvg = list.stream()
                    .filter(m-> m.getSex() == Member.MALE)
                    .mapToInt(Member::getAge)
                    .average()
                    .getAsDouble();

    フィルタ


    distinct()=(重複除外)と
    filter()=(条件フィルタ)は、すべてのストリームに共通の方法です.

    flatMapxxx(), mapxxx(), asxxxStream(), boxed() ...


    flatMapxxx()
    =>AがA 1,A 2要素に置き換えられる
    mapXXX()メソッド
    =>AがCまたはDに置き換えられる

    ループ(peek()、forEach()


    peek():中間処理方法
    forEach():最終処理方法
        intStream
              .filter(a-> a%2 == 0)
              .peek( a-> System.out.println(a))
    次の場合、偶数でフィルタして残りのコンテンツを表示する場合、ストリームはまったく機能しません.peek()は中間処理フェーズメソッドなので
        intStream
              .filter(a-> a%2 == 0)
              .peek( a-> System.out.println(a))
              .sum() 
    このようにpeek()だけが正常に動作します.
    サンプルコード
      public static void main(String[] args) {
            int[] intArr = {1, 2, 3, 4, 5};
    
            System.out.println("[peek()를 마지막에 호출한 경우]");
            Arrays.stream(intArr)
                    .filter(a -> a%2 ==0) // 짝수만 필터링
                    .peek(n-> System.out.println(n)); // 동작하지않음 peek()는 중간처리메소드이기때문에
    
            System.out.println("[최종 처리 메소드를 마지막에 호출한 경우]");
            int total = Arrays.stream(intArr)
                    .filter(a -> a%2 ==0) // 짝수만 필터링
                    .peek(n-> System.out.println(n)) //  동작한다.
                    .sum(); // 최종메소드
            System.out.println("총합 = " + total);
    
            System.out.println("[forEach()를 마지막에 호출한 경우]");
            Arrays.stream(intArr)
                    .filter(a-> a%2 ==0)
                    .forEach(n -> System.out.println(n)); // forEach()는 최종메소드, 최종메소드로 동작함
    
        }
    

    実行結果

    allMatch(),anyMatch(), noneMatch()


    これらは特定の条件を満たすかどうかを調べるマッチング方法である.
    allMatch()は、すべての要素が各値として与えられたPredicate条件を満たすかどうかを示します.
    anyMatch()は、各値として与えられたPredicate条件を満たす少なくとも1つの要素を表す.
    NoneMatch()は、すべての要素が各値によって与えられたPredicate条件を満たしていないかどうかを確認します.
    Arrays.stream(intArr)
    	.allMatch(a -> a%2 ==0); // 모든요소가 2의배수인지
        
        Arrays.stream(intArr)
    	.anyMatch(a -> a%3 ==0); // 하나라도 3의배수가 있는지
        
        Arrays.stream(intArr)
    	.noneMatch(a -> a%3 ==0); // 3의배수가 없는지 
       
    

    デフォルトカウントと()、count()、average()、max()、min()


    大量のデータを加工縮小した復元と考えられる
    カウント、合計、平均値、最大値、最小値などを算出します.

    TakeWhile


    Java 9がサポートする新しい方法
    filterと似たような役割を果たしていますが、ストリームをスライスできる機能を持っています.
    filterはストリーム全体を繰り返し、predicateを各要素に適用します.
    TakeWhileは述語に条件を通過していないやつが現れたときにすぐに停止した.

    DROPWHILE


    JAva 9がサポートする方法
    TAKEWHILEとは逆のタスクを実行します.predicateが初めて虚偽の点を発見した場合、その点の操作を停止し、すべての要素を返します.
    出典:ジャワ島http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788968481475