Basitçe ifade etmek gerekirse, kısıtlamalar, şeyleri bir araya getirmenin daha az doğru yolu olduğu anlamına gelir ve birinci sınıf işlevler, döngü yapıları gibi şeyleri hesaplamayı kolaylaştırır. Döngüyü bu yanıttan alın, örneğin:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
Bu, bir öğeyi yineleme sırasında koleksiyondan bir öğeyi kaldırmak için Java'da güvenli bir zorunluluk yoludur. Çok yakın görünen ama yanlış olan birçok yol var. Bu yöntemin farkında olmayan kişiler, bazen bir kopyadan yineleme gibi, sorunu önlemek için kıvrımlı yollardan geçer.
Bu jenerik yapmak çok zor değil, bu yüzden sadece koleksiyonlarından daha fazlası üzerinde çalışacak Strings
, ancak birinci sınıf işlevler olmadan yüklemi (içindeki koşul if
) değiştiremezsiniz, bu nedenle bu kod kopyalanıp yapıştırılır ve biraz değiştirildi.
Eğer yüklemi bir parametre olarak geçirme yeteneği veren birinci sınıf işlevleri birleştirmezseniz , bunu yapmazsanız çok can sıkıcı hale getiren ve filter
bu Scala kodunda olduğu gibi basit yapı taşlarına sahip olursunuz. aynı şeyi yapar:
list filter (!_.isEmpty)
Şimdi, Scala durumunda derleme zamanında tür sisteminin sizin için neyi kontrol ettiğini düşünün, ancak bu kontrolleri ilk kez çalıştırdığınızda dinamik tür sistemleri tarafından da yapılır:
list
filter
yöntemi destekleyen bir tür , yani bir koleksiyon olmalıdır.
- Öğelerinin bir boole döndüren yöntemi
list
olmalıdır isEmpty
.
- Çıktı, aynı tip elemanlara sahip (potansiyel olarak) daha küçük bir koleksiyon olacaktır.
Bu şeyler kontrol edildikten sonra, programcının vidalaması için başka hangi yollar kalır? !
Son derece açık bir test senaryosu hatasına neden olan yanlışlıkla unuttum . Bu hemen hemen mevcut tek hata, ve ben sadece ters koşul için test edilen koddan doğrudan çeviri çünkü ben bunu yaptım.
Bu desen tekrar tekrar tekrarlanır. Birinci sınıf işlevler, şeyleri hassas semantiklerle yeniden kullanılabilir küçük yardımcı programlara dönüştürmenize izin verir, değişmezlik gibi kısıtlamalar size bunu hızlandırır ve bu yardımcı programların parametrelerini kontrol etmek, onları sıkıştırmak için çok az alan bırakır.
Tabii ki, bu programcıya basitleştirici fonksiyonun filter
zaten var olduğunu bilmesi ve onu bulabilmesi veya kendiniz yaratmanın faydasını tanımasına bağlıdır. Bunu sadece kuyruk özyineleme kullanarak kendiniz her yerde uygulamaya çalışın ve zorunlu versiyonla aynı karmaşıklık teknesinde geri döndünüz, sadece daha da kötüsü. Eğer sırf yapabilirsiniz çok basit bir şekilde yazma, basit sürüm açıktır anlamına gelmez.