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