Modern Java in Action #4


ストリームの概要


ストリームはjava 8 APIに追加された機能であり、コードを宣言形式で実現することができる.
さらに、ストリームは、マルチスレッドコードを実装することなく、データを透過的に並列処理することができる.
ストリームは、データ処理演算をサポートするためにソースから抽出された連続要素です.
  • セットと同様に、特定の要素フォーマットで構成された連続値セットのインタフェースが提供される.
  • データからソース消費データが提供される.
  • 関数プログラミング言語は、通常サポートされる演算およびデータ処理に類似した演算をサポートする.
  • ストリームには2つの主要な特徴があります.
    1つ目はパイプライナーで、ほとんどのストリーム演算は自分のストリームに戻り、ストリーム演算間に接続を確立し、巨大なパイプライン(メソッドボディ)を構成する.
    2つ目は、内部反復です.これは、反復を自分で処理し、結果ストリーム値をある場所に格納する機能を備えています.
    import static java.util.stream.Collectors.toList;
    
    List<String> dishName =
    	menu.stream()                                  // menu로부터 스트림을 얻는다.
        	.filter(dish -> dish.getCalories() > 300)  // 해당 람다식에 해당하는 것들만 통과시킨다.
            .map(Dish::getName)                        
            .limit(3)   //선착순 세 개만 선택하는데, 이를 통해 내부적으로 최적화를 수행할 수 있다.
            .collect(toList()); // 현재 예시에서,해당 메서드를 호출하기 전까지는 아무것도 수행되지 않는다. 

    中間演算と最終演算

    List<String> names = menu.stream()
    						 .filter(dish -> dish.getCalories() > 300)   //중간 연산
                             .map(Dish::getName) //중간 연산
    						 .limit(3) //중간 연산
                             .collect(toList()); //최종 연산

    ちゅうかんえんざん


    中間演算とは,メソッドの結果値がstreamに戻ることによってメソッドのボリューム化を維持する方法である.これらの演算は、最終演算を実行するまで演算を実行しない特徴(lazy)を有する.
    これは、中間演算を順次実行するのではなく、最終演算に統合して最適化するためである.(e.g.ショートトラック、サイクルミックス、...)

    さいしゅうえんざん


    最終演算とは,中間演算によって演算値を消費する行為である.消費のように、流れは一度しか消費できません.データ・ソースが再利用可能なソース(コレクションなど)の場合、新しいストリームを開くことができますが、I/Oがソースの場合、新しいストリームを作成することはできません.
    最終計算は、通常、リスト、Integer、voidなどのストリーム以外の結果を返す.
    long count = menu.stream().<중간 연산들>.count();     //개수 반환
    
    menu.stream().<중간 연산들>.forEach(System.out::println); //void 반환
    
    menu.stream().<중간 연산들> .collect(toList()); //리스트 반환