Tôi đang sử dụng .peek() trong luồng của tôi nhưng nó được tán thành, thật đáng buồn là tôi không thể tìm được giải pháp.Việc sử dụng .peek() trong java 8 suối
phiên bản đơn giản:
static boolean fooAddTester(int size) {
Foo foo = new foo(); //data structure
return IntStream.range(0, size).
.peek(i -> synchronized(r){foo.add(i)})
.allMatch(e -> foo.isLegal());
}
những gì tôi cần làm là để lặp qua các IntStream và để kiểm tra sau mỗi lần chèn nếu cấu trúc dữ liệu foo là hợp pháp. Đây là một cách logic tương đương với:
static boolean fooAddTester(int size) {
Foo foo = new foo(); //data structure
for(int i=0; i<size; i++){
foo.add(i);
if(!foo.isLegal())
return false;
return true;
}
Tuy nhiên nó là phức tạp hơn và tôi đang cố gắng sử dụng suối để đơn giản hóa và học hỏi.
Một cách để làm như vậy mà không sử dụng .peek()
là thế này: mà không làm việc - nhưng tôi chỉ "di chuyển" các vấn đề để .allMatch()
:
return IntStream.range(0, size).
.allMatch(i -> {
synchronized(r){foo.add(i)};
foo.isLegal();
)};
Vấn đề của tôi là rất giống với this question, diffrence là tôi kiểm tra mọi lúc để giải pháp không hoạt động.
Vì vậy, câu hỏi của tôi là:
- là
.peek()
thực sự chỉ để gỡ lỗi hoặc tôi có thể sử dụng nó theo cách này? - Có giải pháp nào tốt hơn không?
- Tôi có nên sử dụng giải pháp thứ hai của mình không?
Tôi đang tìm giải pháp đúng, không phải giải pháp làm việc, tất cả các mã đó đều đang hoạt động.
này có thể giúp: https://softwareengineering.stackexchange.com/questions/308977/is-it-an-antipattern-to-use-peek-to-modify-a-stream-element – Rjiuk
bạn muốn để kiểm tra điều kiện 'sau mỗi lần chèn'; đó là dựa vào tác dụng phụ và nó nên tránh. – Eugene
'đồng bộ' sẽ không giúp bạn nhiều btw - nó sẽ đảm bảo rằng chỉ có một phần tử tại một thời điểm được đưa vào 'foo'; nhưng nó sẽ không đảm bảo * phần tử * nào được đặt vào foo, vì không có thứ tự xử lý trong trường hợp của một luồng song song – Eugene