cuốn sách gpt4 ai đã làm

java - luồng<流> : FlatMap so với giảm

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 03:54:19 28 4
mua khóa gpt4 Nike

Nếu tôi thực thi đoạn mã sau để "kết nối" hai luồng

  • Đầu tiên bằng cách FlatMapping a Luồng<>>
  • sau đó bằng cách giảm Luồng<>>sử dụng Stream.concat()

Tôi nhận được kết quả chính xác như nhau trong cả hai trường hợp, nhưng với số lượng thao tác lọc khác nhau.

lớp công khai FlatMapVsReduce {
public static void main(String[] args) {
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

Vị ngữ vị ngữ1 = i -> {
System.out.println("kiểm tra điều kiện đầu tiên với " + i);
trả lại tôi == 3;
};

Vị ngữ vị ngữ2 = i -> {
System.out.println("kiểm tra điều kiện thứ hai với " + i);
trả lại tôi == 7;
};

System.out.println("Thử nghiệm với FlatMap");
Kết quả số nguyên1 =
Stream.of(list.stream().filter(predicate1),
list.stream().filter(predicate2))
.flatMap(Function.identity())
.peek(i -> System.out.println("nhìn trộm " + i))
.findFirst()
.orElse(null);
System.out.println("result1 = " + result1);

System.out.println();
System.out.println("Thử nghiệm bằng cách giảm");
Kết quả số nguyên2 =
Stream.of(list.stream().filter(predicate1),
list.stream().filter(predicate2))
.reduce(Stream::concat)
.orElseGet(Stream::empty)
.peek(i -> System.out.println("nhìn trộm " + i))
.findFirst()
.orElse(null);
System.out.println("result2 = " + result2);
}
}

Tôi nhận được kết quả mong đợi (3) trong cả hai trường hợp. Tuy nhiên, thao tác đầu tiên áp dụng bộ lọc đầu tiên cho mọi phần tử trong bộ sưu tập, trong khi thao tác thứ hai dừng ngay khi một phần tử được thỏa mãn. Đầu ra là:

Thử nghiệm với FlatMap
kiểm tra điều kiện đầu tiên với 1
kiểm tra điều kiện đầu tiên với 2
kiểm tra điều kiện đầu tiên với 3
nhìn trộm 3
kiểm tra điều kiện đầu tiên với 4
kiểm tra điều kiện đầu tiên với 5
kiểm tra điều kiện đầu tiên với 6
kiểm tra điều kiện đầu tiên với 7
kiểm tra điều kiện đầu tiên với 8
kiểm tra điều kiện đầu tiên với 9
kết quả1 = 3

Thử nghiệm với giảm
kiểm tra điều kiện đầu tiên với 1
kiểm tra điều kiện đầu tiên với 2
kiểm tra điều kiện đầu tiên với 3
nhìn trộm 3
kết quả2 = 3

Tại sao có sự khác biệt về hành vi giữa hai người? Có thể cải thiện mã JDK để hiệu quả trong trường hợp đầu tiên như trong trường hợp thứ hai hay có điều gì đó trong FlatMap khiến điều đó không thể thực hiện được?

Phụ lục: Giải pháp thay thế sau đây cũng hiệu quả như giải pháp sử dụng rút gọn, nhưng tôi vẫn không thể giải thích tại sao:

    Kết quả số nguyên3 = Stream.of(vị ngữ1, vị ngữ2)
.flatMap(c -> list.stream().filter(c).limit(1))
.peek(i -> System.out.println("nhìn trộm " + i))
.findFirst()
.orElse(null);
System.out.println("result3 = " + result3);

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress