java8(2)---ストリームAPI

1.簡単に言えば

Java8で最も重要な変更点のうちの2つを持っています。最初は、ラムダ式であり、他は、ストリームAPIです。

ストリーム処理は、抽象的な概念の集合体である、それは、あなたが実行された操作のセットをしたいように指定することができ、非常に複雑な検索、フィルタリングとマッピングデータやその他の操作を行うことができます。操作をグループ化することで、グループを達成することができますよう、SQLデータベースクエリの実行を使用するのと同様のデータ収集を、操作するためのストリームAPIを使用してください。ストリームAPIのとにかく効率的な導入は、データ処理を提供します。

 

どのような流れ(ストリーム)は?心臓の血管に流れとして見ることができ、全身の血管を通してレオロジー血液は、このストリームで操作された血管を介して、病気や必要な注入を落ちました。心臓の血液が血管を介してトランスポートストリームに変換し、データセットと考えることができ、この操作は、注入操作がフロー計算処理のための私達のストリームAPI、すなわちになると等価です。

データ・ストリームのコレクションが計算されます。

 

それに注意してください。

  それは要素を格納しません1.Stream。

  2.Streamは、ソースオブジェクトを変更しません。代わりに、彼らは新しいストリームを保持した結果を返します。

  3.Stream操作は実行を遅らせています。これは、彼らが結果が実行されなければならないまで待つ必要があることを意味します。

3つのステップをストリーム:

  1.ストリームを作成します。

  2.操作の流れ

  3.注意、結果を得るために、操作を終了:フロー終了操作を再度使用することはできませんした後、

アクションで2.API

  2.1。フローの作成

        // 設定作成流れ 
        ストリーム<学生> STREAM1 = studentList.stream(); 

        // 作成するためのストリームの静的メソッド流れ 
        ストリーム<学生> STREAM2 = Stream.of(
                 新しい新しい学生(1は、 "ジョー・スミス"、12、69である。)、
                 新しい新学生(2、 "ジョン・ドウ"、12は、78.5である)、
                 新たな新しい学生(3、 "王呉"、13、95 )、
                 新しい新しい学生(4、 "趙6"、14、23である)、
                 新たな新しい学生(。5、 "太陽7」、11、55.5 
        ); 
        // 配列の作成ストリームの 
        ストリーム<学生> = Arrays.streamストリーム(新しい新しい学生[] {})。

  2.2。操作の流れ

    2.2.1スクリーニングおよびセグメンテーション

      ラムダを受信フィルタ(述語p)は、ストリームから特定の要素を除外します。

      DISTINCT()フィルタ要素のハッシュコード(によって発生した流れ)とequals()重複除外要素、覚え書き換え

      要素が所定数を超えないように制限(長いmaxSizeの)は、流れを遮断します。適格た限界値は、すべて見つけるために最後まで続行されません

      スキップ(長n)は、リターン流れが最初のn個の要素を投げる、要素をスキップ。フローは、要素の数n、空ストリーム未満である場合。相補の限界(N)

        // フィルターろ過より古い12 
        studentList.stream()
                .filter(学生 - > student.getAge()> 12 
                .forEach(System.outに::のprintln); 
        System.out.printlnは(「----- --------- " ); 

        // DISTINCT重いと
        studentList.stream()
                .distinct()
                .forEach(System.outに::のprintln); 
        System.out.printlnは( " ------ -------- " ); 

        // リミットMySQLの、と少し似て最初の2、取るためにろ過した後
         、// リミット値はすべての終わりを探し続けないであろう資格を見つけ、次の文意志のみを出力最初の2つの条件が満たされるため、2回
        studentList.stream()
                .filter((学生) > - {
                        System.out.printlnは( "フィルタリングを行う" ;)
                         を返す student.getAge()> = 12であり; 
                })
                .limit( 2 
                .forEach(のSystem.out ::のprintln)
        のSystem.out.println(「--- ----------- " ); 

        //は前に2つの条件を満たしてスキップスキップ
        studentList.stream()
                .filter(学生 - > student.getAge()> = 12である
                .SKIP( 2 
                。 forEachの(のSystem.out ::のprintln)。

    2.2.2マッピング

      パラメータとして受信機能マップ(関数F)は、関数は、各要素に適用され、新しい要素にそれをマップします

      パラメータとして受信機能flatMap(関数F)、各ストリームの値を別のストリームに置き換えられ、その後、すべてのフローが一つのストリームに接続されています

      幾分リストと同様とのaddAllメソッドを追加し、単一の要素がコレクションに追加され、一つ一つは、セット内の要素の別のセットに追加され

    公共 ボイド{testStream2()

        // 関数マップは、各要素に適用されるが、各生徒の名前は、新しい要素を形成するために収集され、即ち、新しい要素を生成
        studentList.stream()
                .distinctを()
                .MAP (学生 - > student.getName())
                .forEach(System.outに::のprintln); 
        System.out.printlnはは( "--------" );
         // creatStream各学生のオブジェクトのメソッドを呼び出しますストリームに変換し、各ストリームflatMapストリームに集約さ
        studentList.stream()
                .distinct()
                .flatMap(StreamTest :: creatStream)
                .forEach(のSystem.out ::のprintln); 
    } 
    パブリック 静的ストリーム<学生>creatStream(学生学生){
         返すStream.of(学生)。
    }

    2.2.3ソート

      ソートは、()ソート新しいストリーム、ここで自然な順序を生成し、

      ソート(コンパレータCOMP)コンパレータが順序をソートし、前記新しいストリームを生成します

  2.3フローは、結果を得ます

    2.3.1検索と一致 

      allMatch(述語p)全ての要素が一致するかどうかをチェックします

      要素は少なくとも一つと一致するかどうかをチェックするanyMatch(述語p)

      すべての要素が一致していないかどうかを確認するためにnoneMatch(述語p)

      関数は、FindFirst()は動作フロー(カプセル化されたオプション)の最初の要素を返します

      findAny()任意の要素(任意でカプセル化された)電流の流れ、並流結果乱数を返します

      数()フロー内の要素の合計数を返します。

      最大(コンパレータC)最大流量(カプセル化オプション)を返します。

      分(比較器C)(カプセル化されたオプションで)ストリーム内の最小値を返します

      forEachの(消費者C)内部反復

     // allMatch(述語P)は、すべてのすべての要素が一致するかどうかを確認する年齢の学生> 12である
        ブール結果= studentList.stream()
                .allMatch(学生 - > student.getAge()> 12である); 
        System.out.printlnは(結果); 

        // AnyMatch(述語P)要素は少なくとも一つと一致するかどうかを確認する 
        結果= studentList.stream()
                .anyMatch(スチューデント - > student.getAge()== 12である); 
        のSystem.out.println(結果); 

        // noneMatch(述語すべての要素が一致しない場合p)がチェック 
        =結果studentList.stream()
                .noneMatch(スチューデント - > student.getAge()<11 ); 
        のSystem.out.println(結果)。
        // この関数は、FindFirst()の動作フローの最初の要素(カプセル化オプション)を返す
         // 昇順により第1のスコア後に採取した 
        学生学生= studentList.stream()
                .sorted((STUDENT1、STUDENT2を) - > ダブル.compare(student1.getScore()、student2.getScore()))
                .findFirst()
                に.get(); 
        のSystem.out.println(学生)、

        学生 = studentList.stream()
                .findAny()
                に.get(); 
        System.out.println(学生)。

    2.3.2削減

      (TのiDENはを、BinaryOperator B)低減値を得るために、ストリーム要素を結合するために繰り返すことができます。戻り値T

      低減(BinaryOperator B)値を得るために、ストリーム要素を結合するために繰り返すことができます。戻るオプション<T>

      接続マップと一般マップ-削減削減は、モードと呼ばれます

        // 蓄積し、フロー加算要素の 
        一覧<整数>は、Arrays.asList一覧=(1,2,3,4,5,6,7,8,9,10 ); 
        整数SUM = list.stream()
                .reduce( 0、(X、Y) - > X + Y); 
        System.out.printlnは(SUM); 

        // 学生を見つける 
        ダブルallScore = studentList.stream()
                .MAP(学生 - > student.getScoreを())
                .reduce(ダブル:: SUM)
                に.get(); 
        System.out.printlnは(allScore)。

    2.3.3コレクション     

      収集(コレクタC)ストリームは、他の形態に変換されます。コレクタの受信機(コレクタ)は、要素のためのストリームの概要を作るためにインターフェース、方法を実装しました

      コレクターは、インターフェイスメソッドは、対流が(そのようなリスト、セット、地図を集めるなど)の収集を行う方法を決定し実施しています。

      コレクター1.8簡単に共通コレクタインスタンスを作成するためのツールを提供

コレクター

 

 

        List<Student> studentList = Arrays.asList(
                new Student(1, "张三", 12, 69, Student.Clazz.Clazz2),
                new Student(2, "李四", 12, 78.5,Student.Clazz.Clazz2),
                new Student(3, "王五", 13, 95, Student.Clazz.Clazz3),
                new Student(4, "赵六", 14, 23, Student.Clazz.Clazz3),
                new Student(5, "孙七", 11, 55.5, Student.Clazz.Clazz1),
                new Student(5, "孙七", 11, 55.5, Student.Clazz.Clazz1)
        );

        //toList() 收集到List集合中
        List<String> nameList = studentList.stream()
                .map(student -> student.getName())
                .collect(Collectors.toList());
        System.out.println(nameList);
        //toSet() 收集到Set集合中 自动去重 默认返回的HashSet
        Set<String> nameSet= studentList.stream()
                .map(student -> student.getName())
                .collect(Collectors.toSet());
        System.out.println(nameSet);
        System.out.println(nameSet.getClass());
        //返回指定集合类型
        TreeSet<String> nameTreeSet= studentList.stream()
                .map(student -> student.getName())
                .collect(Collectors.toCollection(TreeSet::new));
        System.out.println(nameTreeSet.getClass());

        //分组groupingBy 返回map集合 类似sql group by了
        //根据年级分组
        Map<Student.Clazz, List<Student>> map = studentList.stream()
                .collect(Collectors.groupingBy(Student::getClazz));
        System.out.println(map);
        //多次分组
        //先按年级再按年龄
        Map<Student.Clazz, Map<Integer, List<Student>>> map2 = studentList.stream()
                .collect(Collectors.groupingBy(Student::getClazz, Collectors.groupingBy(Student::getAge)));
        System.out.println(map2);

        //分区partitioningBy 入参是个断言型接口
        studentList.stream()
                .collect(Collectors.partitioningBy((student) -> student.getScore() >= 60));

        //summarizingDouble 对某个值进行 数据统计输出
        //对score进行统计
        DoubleSummaryStatistics statistics = studentList.stream()
                .collect(Collectors.summarizingDouble(Student::getScore));
        statistics.getAverage();
        statistics.getCount();
        statistics.getMax();
        statistics.getMin();
        statistics.getSum();

 

Student类:

    private int id;
    private String name;
    private int age;
    private double score;
    private Clazz clazz;

    public Student(String name) {
        this.name = name;
    }

    public Student(int id, String name, int age, double score) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public Student(int id, String name, int age, double score, Clazz clazz) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.score = score;
        this.clazz = clazz;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public Clazz getClazz() {
        return clazz;
    }

    public void setClazz(Clazz clazz) {
        this.clazz = clazz;
    }

    public String show() {
        return "测试方法引用";
    }

    @Override
    public int hashCode() {
        final int prime = 11;
        int hashCode = 1;
        hashCode = prime * hashCode + age;
        hashCode = prime * hashCode + id;
        hashCode = prime * hashCode + ((name == null) ? 0 : name.hashCode());
        long temp;
        temp = Double.doubleToLongBits(score);
        hashCode = prime * hashCode + (int) (temp ^ (temp >>> 32));
        return hashCode;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }

        if (getClass() != obj.getClass()) {
            return false;
        }
        Student other = (Student) obj;
        if (age != other.age) {
            return false;
        }

        if (id != other.id) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        if (Double.doubleToLongBits(score) != Double.doubleToLongBits(other.score)) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "[id=" + id + ", name=" + name + ", age=" + age + ", score=" + score + ", Class=" + clazz + "]";
    }

    public static enum Clazz{
        Clazz1,
        Clazz2,
        Clazz3,
    }

 

おすすめ

転載: www.cnblogs.com/nijunyang/p/11334814.html