Tôi đang đọc về các luồng Java và khám phá những điều mới khi tôi đi cùng. Một trong những điều mới tôi tìm thấy là peek()
chức năng. Hầu hết mọi thứ tôi đã đọc trên peek đều nói rằng nó nên được sử dụng để gỡ lỗi Luồng của bạn.
Điều gì xảy ra nếu tôi có Luồng trong đó mỗi Tài khoản có tên người dùng, trường mật khẩu và phương thức login () và loginIn ().
tôi cũng có
Consumer<Account> login = account -> account.login();
và
Predicate<Account> loggedIn = account -> account.loggedIn();
Tại sao điều này sẽ rất tệ?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Bây giờ theo như tôi có thể nói điều này thực hiện chính xác những gì nó dự định làm. Nó;
- Có một danh sách các tài khoản
- Thử đăng nhập vào từng tài khoản
- Lọc bất kỳ tài khoản nào không đăng nhập
- Thu thập các tài khoản đã đăng nhập vào một danh sách mới
Nhược điểm của việc làm một cái gì đó như thế này là gì? Bất kỳ lý do tôi không nên tiến hành? Cuối cùng, nếu không phải là giải pháp này thì sao?
Phiên bản gốc của điều này đã sử dụng phương thức .filter () như sau;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
có thể là hoạt động bạn muốn trái ngược với peek
. Chỉ vì nó trong API không có nghĩa là nó không mở để lạm dụng (như Optional.of
).
.peek(Account::login)
và .filter(Account::loggedIn)
; không có lý do gì để viết Người tiêu dùng và Dự đoán mà chỉ gọi một phương thức khác như thế.
forEach()
và peek()
, chỉ có thể hoạt động thông qua các tác dụng phụ; những thứ này nên được sử dụng cẩn thận. Mùi. Nhận xét của tôi là nhiều hơn để nhắc nhở rằng peek
hoạt động (được thiết kế cho mục đích gỡ lỗi) không nên được thay thế bằng cách thực hiện điều tương tự bên trong một hoạt động khác như map()
hoặc filter()
.