Java--Streamフロー操作

23163 ワード

Java–Streamフロー操作
一、Streamの概要
Jdkは1.7の後に関数式プログラミングを提供し,それに伴ってStreamストリームも提供した.
ストリームによってチェーン操作が達成される.
Streamここの流れはIO流とは無関係で、ここの流れは流式操作を指し、流水線操作である.
Streamsフロー・オペレーションの主要パッケージには、フローの作成、中間フロー・オペレーション、終了フロー・オペレーションの3つのモジュールがあります.
ここで、ストリームの作成は主にStreamオブジェクトの作成です.各Streamオブジェクトでは、終了操作は1回のみ使用できます.
中間フロー操作とは、各種の中間フロー操作方法、例えば、重量除去、フィルタリング、並べ替えなどを指す.
エンドフロー操作とは、最終結果を生成することを目的とする結果操作を指す.
二、フローの作成
Javaでは、さまざまな方法でストリームを作成できます.
1、配列に基づいてフローを作成する
Arraysには、配列を対応するStreamに変換する静的方法がある.
Streamのofメソッドも呼び出します.
	int[] a = new int[] { 1, 2, 3, 4 };

     IntStream s = Arrays.stream(a);//   

     
	Stream<String> s2=Stream.of("h","e","l","l","o");//   

	s.forEach(System.out::print);//    
	s2.forEach(System.out::print);

2、ジェネレータに基づいてフローを作成する
Streamは、ストリームの構築に使用できるジェネレータメソッドを提供します.
	Builder builder= Stream.builder();

    Stream<String> stream= builder.add("hello").add("world").build();

    stream.forEach(System.out::println);

3、集合に基づいてフローを作成する
コレクションは配列と同様にストリームを作成することもできます.
 List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
      
        Stream<Integer> stream=list.stream();
        stream.forEach(System.out::println);

4、関数に基づいてフローを作成する
Streamのgenerateメソッドは、生成回数をlimit関数によって制御しながら、Supplierパラメータ、すなわち戻り値のある関数を受信する.
Stream<String> stream=Stream.generate(()->"hello world").limit(10);//  10 
        stream.forEach(System.out::println);//  10 hello world

二、中間流
ここでのストリーム中間動作とは、その動作の戻り値がストリームのままであることを意味する.
また、中間ストリーム操作には、終端ストリームの終端が必要である.
フロー操作関数は次のとおりです.
シーケンス番号
操作
方法
説明
コメント
1
filter
Streamfilter(Predicatepredicate)
現在のストリームでパラメータpredicateフィルタ条件を満たす要素からなる新しいストリームを返します.
フィルタ
2
map
Streammap(Functionmapper)
現在のストリームの各要素に与えられたmapperが作用した後の結果からなる新しいストリームを返します.
関数#カンスウ#
3
mapToInt
IntStreammapToInt(ToIntFunctionmapper)
与えられたmapperが現在のストリームの各要素に作用した後の結果からなる新しいIntストリームを返す
関数#カンスウ#
4
mapToLong
LongStreammapToLong(ToLongFunctionmapper)
与えられたmapperが現在のストリームの各要素に作用した後の結果からなる新しいLongストリームを返す
関数#カンスウ#
5
mapToDouble
DoubleStreammapToDouble(ToDoubleFunctionmapper)
与えられたmapperが現在のストリームの各要素に作用した後の結果からなる新しいDoubleストリームを返す
関数#カンスウ#
6
flatMap
StreamflatMap(Function>mapper)
与えられたmapperが現在のストリームに作用する各要素に基づいて、結果を新しいストリームに構成して返します.
フラット関数
7
flatMapToInt
IntStreamflatMapToInt(Functionmapper)
与えられたmapperが現在のストリームに作用する各要素に基づいて,結果を新しいIntストリームに構成して返す
フラット関数
8
flatMapToLong
LongStreamflatMapToLong(Functionmapper)
与えられたmapperが現在のストリームに作用する各要素に基づいて、結果を新しいLongストリームに構成して返す
フラット関数
9
flatMapToDouble
DoubleStreamflatMapToDouble(Functionmapper)
与えられたmapperが現在のストリームに作用する各要素に基づいて、結果を新しいDoubleストリームに構成して返します.
フラット関数
10
distinct
Streamdistinct()
現在のストリームの重複要素を除去した後の新しいストリームを返します.
重さを落とす
11
sorted
Streamsorted()
現在のストリームの要素のソート後の新しいストリームを返します.要素タイプがComparableを実装する必要があります.
ツールバーの
12
sorted
Streamsorted(Comparatorcomparator)
現在のストリームの要素のソート後の新しいストリームを返します.Comparatorを渡す必要があります.
ツールバーの
13
peek
Streampeek(Consumeraction)
ストリーム内の各要素に対してアクションアクションを実行
チェック
14
limit
Streamlimit(longmaxSize)
指定した数の要素からなる新しいストリームを返します.
制限
15
skip
Streamskip(longn)
n番目以降の要素からなる新しいストリームを返します.
スキップ
これらの関数の使い方は同じですが、パラメータと戻り値に違いがあります.一部の関数は実は機能が全く同じで、名前が違うだけで、区別しやすいだけです.
1、ろ過
filterメソッドはフィルタメソッドであり、ストリーム内のすべての要素に対して、条件を満たす要素は新しいストリームを構成するために保持されます.
 //   
    static void filter_o(List<Integer> list){
       Stream<Integer> stream= list.stream();

       stream.filter(e->e>3).peek(System.out::println).count();
        //peek(System.out::println).count()==forEach(System.out::println)
    }

    // Stream   
    public static void main(String[] args) {


        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);

        filter_o(list);
      

    }

2、peek調べ
peek対流の各要素はforEachのように動作するが、forEachは終端流であり、peekは中間流である.
以上の文では、次のように書くこともできます.
stream.filter(e->e>3).peek(e->System.out.println(e)).count();

通常は閲覧に使用されます.
3、mapマッピング
mapマッピング関数で、要素を処理します.
mapメソッドのパラメータタイプはFunctionで、この関数インタフェースはパラメータを受け入れ、結果を返すために使用されます.
同上を使う.
4、distinct脱重
distinctメソッドは重量除去に使用されます
5、limit切り取り
前のn要素に取り込む
6、sortedソート
要素のソート
.........
三、終端流
エンドストリームを使用すると、そのストリームは終了し、ストリームは戻りません.
一般的な方法は次のとおりです.
1、forEachサイクル
1つの関数を受信し、各要素に対して1回の関数を実行し、遍歴によく使用されます.
2、countカウント
ストリーム内の要素の数を返します.
3、max/min最値
指定されたルールによって、最大値が返されます.
4、collectまとめ
collectは、要約をまとめ、対応するデータセットを返すために使用されます.
この方法は2つあり、1つは3つの関数をパラメータとして受信、1つはcollectorを受信する.
 public interface Stream<T> extends BaseStream<T, Stream<T>> {
     
        <R> R collect(Supplier<R> supplier,
                      BiConsumer<R, ? super T> accumulator,
                      BiConsumer<R, R> combiner);
     
        <R, A> R collect(Collector<? super T, A, R> collector);
    }

、最初のリロード方法、3つのパラメータはそれぞれ3つの関数で、直接関数参照を使用すればいいです.
List<Integer> list1=stream.filter(e->e>3)
    .peek(e>System.out.println(e))
    .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

//  1      ,  2         ,  3     
//      ,     lambda, :
()->{ArrayList l=new ArrayList<>();return l;},
(l,e)->{l.add(e);},
(l,e)->{l.addAll(e);}


2番目のリロード方法では、コレクタを運ぶために定義されたCollectorタイプのパラメータを入力する必要がありますが、JDKはストリーム内の要素を様々なコンテナに変換できるCollectorsツールクラスを提供しています.
次のようになります.
List<Integer> list1=stream.filter(e->e>3).peek(e->System.out.println(e))
      .collect(Collectors.toList());