Java akışları hakkında okuyorum ve devam ederken yeni şeyler keşfediyorum. Bulduğum yeni şeylerden biri peek()
işlevdi. Gözden geçirdiğim hemen hemen her şey, akışlarınızın hata ayıklaması için kullanılması gerektiğini söylüyor.
Her bir Hesabın bir kullanıcı adı, şifre alanı ve bir login () ve loginIn () yöntemine sahip olduğu bir Akışım olsaydı ne olurdu.
Bende var
Consumer<Account> login = account -> account.login();
ve
Predicate<Account> loggedIn = account -> account.loggedIn();
Bu neden bu kadar kötü?
List<Account> accounts; //assume it's been setup
List<Account> loggedInAccount =
accounts.stream()
.peek(login)
.filter(loggedIn)
.collect(Collectors.toList());
Şimdi söyleyebildiğim kadarıyla bunun tam olarak ne yapması gerektiğini yapıyor. O;
- Hesapların bir listesini alır
- Her hesaba giriş yapmayı dener
- Giriş yapmayan tüm hesapları filtreler
- Giriş yapılmış hesapları yeni bir listede toplar
Böyle bir şey yapmanın dezavantajı nedir? Devam etmememin bir nedeni var mı? Son olarak, bu çözüm değilse ne olacak?
Bunun orijinal sürümü .filter () yöntemini aşağıdaki gibi kullanmıştır;
.filter(account -> {
account.login();
return account.loggedIn();
})
forEach
tersine istediğiniz işlem olabilir peek
. API'de olması kötüye kullanıma açık olmadığı anlamına gelmez (gibi Optional.of
).
.peek(Account::login)
ve olabileceğini unutmayın .filter(Account::loggedIn)
; sadece böyle bir yöntemi çağıran bir Tüketici ve Tahmin yazmak için hiçbir neden yoktur.
forEach()
peek()
”. Daha fazla söylemek, peek
işlemin (hata ayıklama amaçları için tasarlanan) map()
veya gibi başka bir işlem içinde aynı şeyi yaparak değiştirilmemesi gerektiğini hatırlatmaktı filter()
.