Google Guava'nın her zaman geri dönentrue
bir koşulu vardır . Java 8'in benzer bir özelliği var Predicate
mı? Kullanabileceğimi biliyorum (foo)->{return true;}
, ama önceden yapılmış, buna benzer bir şey istiyorum Collections.emptySet()
.
Google Guava'nın her zaman geri dönentrue
bir koşulu vardır . Java 8'in benzer bir özelliği var Predicate
mı? Kullanabileceğimi biliyorum (foo)->{return true;}
, ama önceden yapılmış, buna benzer bir şey istiyorum Collections.emptySet()
.
Yanıtlar:
Java 8'de yerleşik her zaman doğru ve her zaman yanlış yüklemler yoktur. Bunları yazmanın en kısa yolu
x -> true
ve
x -> false
Bunları şununla karşılaştırın:
Predicates.alwaysTrue() // Guava
ve son olarak anonim bir iç sınıfa:
new Predicate<Object>() {
public boolean test(Object x) {
return true;
}
}
Muhtemelen Guava'nın bu yerleşik yüklemlere sahip olmasının nedeni, anonim bir iç sınıfa göre statik bir yöntem çağrısının büyük bir sözdizimsel avantajının olmasıdır. Java 8'de, lambda sözdizimi o kadar kısadır ki, statik bir yöntem çağrısı yazmanın sözdizimsel bir dezavantajı vardır .
Bu sadece sözdizimsel bir karşılaştırma. x -> true
Birden çok sınıfa yayılan ve her biri kendi yüklem örneğini yaratan olaylarla karşılaştırıldığında, tek bir global her zaman doğru yüklem olsaydı, muhtemelen küçük bir alan avantajı vardır . Endişelendiğin bu mu? Tasarruflar ikna edici görünmüyordu, bu yüzden muhtemelen ilk etapta eklenmemişlerdi. Ancak gelecekteki bir sürüm için yeniden değerlendirilebilir.
GÜNCELLEME 2015-04-24
Biz, statik çeşitli eklenmesi gibi adlandırılmış işlevleri kabul ettik Predicate.alwaysTrue
, Runnable.noop
vb, ve biz Java SE gelecekteki sürümlerinde artık eklemeye karar verdik.
Kesinlikle yazılı bir lambda'ya karşı bir ada sahip bir şeyde bir değer vardır, ancak bu değer oldukça küçüktür. Biz insanların okuma ve yazma öğrenmek bekliyoruz x -> true
ve () -> { }
ve kullanım deyimsel olacağını söyledi. Hatta değeri Function.identity()
over x -> x
sorgulanabilir.
Yazılı bir lambda'yı değerlendirmek yerine mevcut bir işlevi yeniden kullanmanın küçük bir performans avantajı vardır, ancak bu tür işlevlerin kullanımının o kadar küçük olmasını bekleriz ki böyle bir avantaj ihmal edilebilir, kesinlikle API bloatına değmez.
Holger, yorumlarında, Predicate.or
ve benzeri birleşik işlevleri optimize etme olasılığından da bahsetti . Bu da dikkate alındı ( JDK-8067971 ), ancak biraz kırılgan ve hataya açık olarak görüldü ve uygulama çabasına değmeyecek kadar nadiren meydana geldi.
Ayrıca bu Lambda SSS girişine bakın.
Predicate.alwaysTrue()
seninle kazara yazarak da hata yapabilirsin Predicate.alwaysFalse()
.
alwaysTrue()
ve alwaysFalse()
. Gerçek lambda ile birçok varyasyonum var; Her seferinde formülü esasen yeniden oluşturuyorum. Özünde, alwaysTrue()
yapmak istediğim şey için anlamsal bir etikettir; x->true
aslında bunu her seferinde yeniden yapıyor. Çok büyük değil, ama dikkate değer.
Predicate.alwaysTrue()
ve Predicate.alwaysFalse()
örnekleri onlar gibi yöntemler birleştirilerek kabul edilebilir yani, Predicate.or
, Predicate.and
, ve Predicate.negate()
. Bu, ek yük olmadan yoluyla birleştirerek Predicate
değişkenleri önceden başlatmaya alwaysTrue()
ve tahminler eklemeye izin verir and
. Lambda ifadelerinin nesne kimliği garantisi olmadığı için, bu başarısız olabilir x->true
. Bu arada, metodu X
olan bir sınıfım varsa , kullanmak gerçekten önerilenden daha kısa ama gerçekten tavsiye edilmiyor…static
y(){return true;}
X::y
x->true
x -> true
dezavantajı bir değişkeni kullanmadan kullanmam gerekmesidir. Bu, gereksiz beyin yükü ve ayrıca IDE'mde bir uyarı yaratır. Kullanmaya çalıştım _ -> true
ama bu bir sözdizimi hatası. Java'da "kullanılmayan parametre" için kesinlikle bir anahtar sözcük (okuyun: keyletter) eksik. Umarım Java 9'da böyle bir şey gelir (veya en azından: Java ölmeden önce ne olursa olsun ^^)
Guava olmadan
Boolean.TRUE::booleanValue
Predicate
bir tartışma gerektirmediği için bir değil.
(foo)->{return true;}
yapabileceğim en iyisi, ben daha iyi istiyorum. Ama sen büyüdünx->true
, bu çok daha iyi ve ilk sorunu hafifletiyor. İkinci konu, mantık ve statik bildirimdir. Ben kullanırsanızx->true
, farkında olmadan (örneğin mahveder, hangi hala mantık dahil olduğux->!true
). AncakPredicate.alwaysTrue()
, yalnızca bir veya iki benzer yöntem olduğu için mantık hatası için sıfır yer vardır. Ayrıca IDE kodunu ücretsiz olarak tamamlıyorum.x->true
neredeyse iyi, ancak yine dePredicate.alwaysTrue()
yukarıdaki nedenlerden dolayı bir yöntem yazdım .