全リスト上のJava 8ストリーム計算

mah454:

私は見てみましょうが、レイジーを取得:実際の電力ストリームの探検(subramaniamヴェンカト)ユーチューブの動画を。(約分26-30。)

例では、forループ。

List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);
int result = 0;
for(int e: values){
  if(e > 3 && e % 2 == 0){
    result = e * 2;
    break;
  }
}  

8「単位操作」を有します

彼の例によると:

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

        List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);

        System.out.println(
                numbers.stream()
                        .filter(e -> e > 3)
                        .filter(e -> e % 2 == 0)
                        .map(e -> e * 2)
                        .findFirst()
                        .orElse(0)
        );


    }
}

それは21「単位操作」を持っているように、このコードが見えます。

そして彼は、このコードを使用することをお勧めします。

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

        List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);

        System.out.println(
                numbers.stream()
                        .filter(MainClass::isGT3)
                        .filter(MainClass::isEven)
                        .map(MainClass::doubleIt)
                        .findFirst()
                        .orElse(0)
        );


    }

    private static int doubleIt(Integer e) {
        return e * 2;
    }

    private static boolean isEven(Integer e) {
        return e % 2 == 0;
    }

    private static boolean isGT3(Integer e) {
        return e > 3;
    }
}

本当に私が理解したい、どのようにこれは8つの単位操作の代わりに、21単位操作を持っていることを証明することができますか?

ダミアン・ラファエルLattenero:

いいえいいえいいえ、あなたのアイデアを誤解しました。アイデアは、ストリーム上の遅延評価です。両方が(彼の言葉を使用して)「8の計算」を取ると、彼はそれが21を取るようにそれが見えたと言ってみました。

この

  numbers.stream()
                  .filter(MainClass::isGT3)
                  .filter(MainClass::isEven)
                  .map(MainClass::doubleIt)
                  .findFirst()
                  .orElse(0)

そして

numbers.stream()
                .filter(e -> e > 3)
                .filter(e -> e % 2 == 0)
                .map(e -> e * 2)
                .findFirst()
                .orElse(0)

ある全く同じ唯一の違いは、読みやすくするために関数を作成し、それがすべてです。不可欠コード:

List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);
int result = 0;
for(int e: values){
  if(e > 3 && e % 2 == 0){
    result = e * 2;
    break;
  }
}

それらは必要に応じて呼び出されているため計算するには、同じ正確なストリーム内のコードが、それが全てのフィルタないことを意味し> 3、すべてのフィルタを% 2 == 0、いいえ、それは動作を組み合わせ、及び、端末機能が呼び出されたときにそれを適用します(以下のようなfindFirst()

あなたは機能の間にいくつかのプリントを入れた場合、映像が示すように、それは8つの操作が表示されます:

public class Main {

    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 4, 6, 7, 8, 9, 10);

        System.out.println(processStream(numbers)); 
        System.out.println(getNumber(numbers));
        System.out.println(getNumberEfficient(numbers));
    }

    static Stream<Integer> processStream(List<Integer> numbers){
        return numbers.stream()
                .filter(e -> {
                    System.out.println("GT3: " + e);
                    return e > 3;
                })
                .filter(e -> {
                    System.out.println("is Even: " + e);
                    return e % 2 == 0;
                })
                .map(e -> {
                    System.out.println("times 2: " + e);
                    return e * 2;
                } );
    }

    static int getNumberEfficient(List<Integer> numbers){
        return numbers.stream()
                .filter(e -> {
                    System.out.println("GT3 and even: " + e);
                    return e > 3 && e % 2 == 0;
                })
                .map(e -> {
                    System.out.println("times 2: " + e);
                    return e * 2;
                } )
                .findFirst()
                .orElse(0);
    }

    static int getNumber(List<Integer> numbers){
        return numbers.stream()
                .filter(e -> {
                    System.out.println("GT3: " + e);
                    return e > 3;
                })
                .filter(e -> {
                    System.out.println("is Even: " + e);
                    return e % 2 == 0;
                })
                .map(e -> {
                    System.out.println("times 2: " + e);
                    return e * 2;
                } )
                .findFirst()
                .orElse(0);
    }
}

それが返されます:

これはパイプラインで過ごすがあるので、何も、実行されませんでした

java.util.stream.ReferencePipeline$3@7ba4f24f

Theesは8つの操作です。

GT3: 1
GT3: 2
GT3: 3
GT3: 5
is Even: 5
GT3: 4
is Even: 4
times 2: 4
8

そして、これは代わりに、2つのフィルタを行うので、あなただけのいずれかの操作を行い、8から6に減らすことができ、少しの最適化です。

GT3 and even: 1
GT3 and even: 2
GT3 and even: 3
GT3 and even: 5
GT3 and even: 4
times 2: 4
8

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=230577&siteId=1
おすすめ