bir değer döndüren toplayıcı Bu işlevsel programlama ve akışlar hakkında biraz yeşilim, ama bildiğim küçük bir şey çok yararlı oldu!Java 8 Sadece tek bir değer varsa
Ben birkaç kez bu durumu vardı geldim:
List<SomeProperty> distinctProperties = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.toList());
if (distinctProperties.size() == 1) {
SomeProperty commonProperty = distinctProperties.get(0);
// take some action knowing that all share this common property
}
Ne istiyorum gerçekten geçerli:
Optional<SomeProperty> universalCommonProperty = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.singleOrEmpty());
ben
singleOrEmpty
şey sadece kombine olarak yanında diğer durumlarda yararlı olabilir düşünüyorum
distinct
ile. Ben bir n00b uber oldugunda Java Koleksiyonlar Framework'ü yeniden icat ettim, çünkü orada oldugunu bilmiyordum, bu yüzden hatalarimi tekrarlamamaya çalisiyorum. Java, bu
singleOrEmpty
bir şeyi yapmak için iyi bir yolla geliyor mu? Yanlış mı formüle ediyorum?
Teşekkürler!
DÜZENLEME: İşte, distinct
vakası için bazı örnek veriler. Eğer map
adım yok sayarsanız:
Optional<SomeProperty> universalCommonProperty = someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.singleOrEmpty());
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.of(1)
[2, 2] -> Optional.of(2)
[1, 2] -> Optional.empty()
benim türlerini berbat veya eski kodu var olduğunda buna ihtiyacım bulabilirsiniz. Hızlı bir şekilde "Bu koleksiyonun tüm öğeleri bu mülkü paylaşıyor, bu yüzden şimdi bu paylaşılan özelliği kullanarak biraz harekete geçebilirim" diyebileceğimiz gerçekten çok güzel. Başka bir örnek, bir kullanıcının çeşitli öğeleri çok seçtiği ve tüm bunlar için geçerli olan bir şeyi (eğer bir şey varsa) görmeye çalıştığınızdır.
EDIT2: Örneğim yanıltıcı ise özür dilerim. Anahtar, singleOrEmpty'dur. Genelde bir distinct
ürününü öne çıkardığımı fark ettim, ancak başka bir çeşit filter
kolayca olabilir.
Optional<SomeProperty> loneSpecialItem = someList.stream()
.filter(obj -> obj.isSpecial())
.collect(Collectors.singleOrEmpty());
[special] -> Optional.of(special)
[special, special] -> Optional.empty()
[not] -> Optional.empty()
[not, special] -> Optional.of(special)
[not, special, not] -> Optional.of(special)
EDIT3: Ben singleOrEmpty motive yerine sadece kendi başına bunun için sorarak berbat düşünüyorum.
SomeProperty distinctProperty = Iterables.getOnlyElement(
someList.stream()
.map(obj -> obj.getSomeProperty())
.distinct()
.collect(Collectors.toList()));
IllegalArgumentException
birden fazla değer yoksa yükseltilecek: Eğer Guava kullanarak sakıncası yoksa
Optional<Int> value = someList.stream().collect(Collectors.singleOrEmpty())
[] -> Optional.empty()
[1] -> Optional.of(1)
[1, 1] -> Optional.empty()
@Ned Twigg Nazik olmak ve somelist içeriğini gönderebilir vardır Yani senin sorunun yeniden üretilebilir? –
C# 'in LINQ'unda bu,' SingleOrDefault 'ile benzerdir. –