Saya membaca tentang aliran Jawa dan menemukan hal-hal baru saat saya melanjutkan. Salah satu hal baru yang saya temukan adalah peek()
fungsinya. Hampir semua yang saya baca di mengintip mengatakan itu harus digunakan untuk men-debug Streaming Anda.
Bagaimana jika saya memiliki Stream di mana setiap Akun memiliki nama pengguna, bidang kata sandi dan metode login () dan login ().
saya juga punya
Consumer<Account> login = account -> account.login();
dan
Predicate<Account> loggedIn = account -> account.loggedIn();
Mengapa ini begitu buruk?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Sejauh yang saya tahu ini melakukan persis apa yang seharusnya dilakukan. Itu;
- Mengambil daftar akun
- Mencoba masuk ke setiap akun
- Menyaring semua akun yang tidak masuk
- Mengumpulkan akun yang login ke daftar baru
Apa kerugian melakukan sesuatu seperti ini? Ada alasan saya tidak melanjutkan? Terakhir, jika bukan solusi ini lalu apa?
Versi asli ini menggunakan metode .filter () sebagai berikut;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
mungkin operasi yang Anda inginkan sebagai lawan peek
. Hanya karena ada di API tidak berarti itu tidak terbuka untuk penyalahgunaan (seperti Optional.of
).
.peek(Account::login)
dan .filter(Account::loggedIn)
; tidak ada alasan untuk menulis Consumer and Predicate yang hanya memanggil metode lain seperti itu.
forEach()
dan peek()
, hanya dapat beroperasi melalui efek samping; ini harus digunakan dengan hati-hati. ” Komentar saya lebih untuk mengingatkan bahwa peek
operasi (yang dirancang untuk tujuan debugging) tidak boleh diganti dengan melakukan hal yang sama di dalam operasi lain seperti map()
atau filter()
.