GÜNCELLEME: Bu yanıt asıl soruya yanıt niteliğinde, Java SE 8'in Çiftleri veya Tuples'i var mı? (Ve örtük olarak, değilse, neden olmasın?) OP soruyu daha eksiksiz bir örnekle güncelledi, ancak herhangi bir Çifti yapısı kullanılmadan çözülebileceği anlaşılıyor. [OP'den not: İşte diğer doğru cevap .]
Kısa cevap hayır. Ya kendi başınıza dönmeli ya da onu uygulayan birkaç kütüphaneden birini getirmelisiniz.
Sahip olmak Pair
Java SE'de sınıfa en az bir kez önerildi ve reddedildi. OpenJDK posta listelerinden birinde bu tartışma konusuna bakın . Ödünleşmeler açık değildir. Bir yandan, diğer kütüphanelerde ve uygulama kodunda birçok Pair uygulaması vardır. Bu bir ihtiyaç olduğunu gösterir ve Java SE'ye böyle bir sınıf eklemek yeniden kullanımı ve paylaşımı artıracaktır. Öte yandan, bir Pair sınıfına sahip olmak, gerekli tür ve soyutlamaları yaratmadan Çiftler ve koleksiyonlardan karmaşık veri yapıları yaratma cazibesine katkıda bulunur. (Bu Kevin Bourillion'un mesajından çıkan mesajın bir açıklamasıdır .)
Herkesin tüm e-posta dizisini okumasını tavsiye ederim. Oldukça içgörüseldir ve hiçbir parlaması yoktur. Oldukça inandırıcı. Başladığında, "Evet, Java SE'de bir Pair sınıfı olmalı" diye düşündüm, ancak iş parçacığının sonuna geldiğinde fikrimi değiştirdim.
Ancak JavaFX'in javafx.util.Pair sınıfına . JavaFX'in API'leri, Java SE API'lerinden ayrı olarak gelişti.
Bağlantılı sorudan görebileceğiniz gibi Java C ++ Çifti eşdeğeri nedir? görünüşte bu kadar basit bir API'yi çevreleyen oldukça geniş bir tasarım alanı var. Nesneler değişmez mi olmalı? Serileştirilebilir olmalı mı? Karşılaştırılabilir mi? Sınıf final mi olmalı yoksa değil mi? İki unsur sipariş edilmeli mi? Bir arayüz mü yoksa sınıf mı olmalı? Neden çiftler halinde durmalıyız? Neden üçlü, dörtlü veya N-tuples olmasın?
Ve elbette elementler için kaçınılmaz adlandırma var:
- (a, b)
- (birinci, ikinci)
- (sol sağ)
- (araba, cdr)
- (foo, bar)
- vb.
Bahsedilen büyük bir mesele, Çiftlerin ilkellerle olan ilişkisidir. (int x, int y)
2B alanda bir noktayı temsil eden bir referans noktanız varsa, bunu iki 32 bit sözcük yerine üç nesnePair<Integer, Integer>
tüketir . Ayrıca, bu nesneler öbek üzerinde bulunmalı ve GC yüküne neden olacaktır.
Akımlar gibi, Çiftler için ilkel uzmanlaşmaların olması gerektiği açıktır. Görmek ister miyiz:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Bir IntIntPair
yığın bile hala bir nesne gerektirir.
Bunlar elbette, java.util.function
Java SE 8'deki paketteki fonksiyonel arayüzlerin çoğalmasını anımsatıyor. Şişirilmiş bir API istemiyorsanız, hangilerini dışarıda bırakacaksınız? Bunun yeterli olmadığını ve uzmanlık alanlarının,Boolean
da ekleneceğini .
Benim düşüncem, Java uzun bir süre önce bir Pair sınıfı ekleseydi, basit ya da basit olurdu ve şu anda öngördüğümüz birçok kullanım örneğini tatmin etmeyecekti. Çifti JDK 1.0 zaman dilimine eklenmiş olsaydı, muhtemelen değişebilir olurdu! (Bkz. Java.util.Date.) İnsanlar bundan memnun olur muydu? Tahminimce, Java'da bir Pair sınıfı olsaydı, bu tür-gerçekten-kullanışlı olmazdı ve herkes hala ihtiyaçlarını karşılamak için kendi başlarına dönecek, dış kütüphanelerde çeşitli Pair ve Tuple uygulamaları olacaktı, ve insanlar hala Java'nın Pair sınıfını nasıl düzelteceklerini tartışıyor / tartışıyorlardı. Başka bir deyişle, bugün bulunduğumuz yerde.
Bu arada, JVM'de (ve nihayetinde Java dilinde) değer türleri için daha iyi destek olan temel sorunu ele almak için bazı çalışmalar devam etmektedir . Bu Değerlerin Durumu belgesine bakın. Bu ön, spekülatif çalışmadır ve sadece JVM perspektifinden meseleleri kapsar, ancak zaten arkasında oldukça fazla düşünce vardır. Elbette bunun Java 9'a gireceği veya herhangi bir yere gireceği konusunda hiçbir garanti yoktur, ancak bu konuyla ilgili mevcut düşünme yönünü gösterir.
AbstractMap.SimpleImmutableEntry<K,V>
yıllarca var… Ama yine de, sadece filtreleme ve eşleme için eşlemei
yapmak yerine : neden yalnızca eşleme olmadan filtreleme yapmıyorsunuz ?(i, value[i])
value[i]
i
value[i]