AGGIORNAMENTO: Questa risposta è in risposta alla domanda originale, Java SE 8 ha coppie o tuple? (E implicitamente, in caso contrario, perché no?) L'OP ha aggiornato la domanda con un esempio più completo, ma sembra che possa essere risolto senza utilizzare alcun tipo di struttura Pair. [Nota dall'OP: ecco l'altra risposta corretta .]
La risposta breve è no. Devi arrotolare il tuo o portare una delle numerose librerie che lo implementano.
Avere una Pair
lezione in Java SE è stato proposto e respinto almeno una volta. Vedi questo thread di discussione su una delle mailing list di OpenJDK. I compromessi non sono evidenti. Da un lato, ci sono molte implementazioni di Pair in altre librerie e nel codice dell'applicazione. Ciò dimostra una necessità e l'aggiunta di tale classe a Java SE aumenterà il riutilizzo e la condivisione. D'altra parte, avere una classe Pair aumenta la tentazione di creare strutture di dati complicati da coppie e raccolte senza creare i tipi e le astrazioni necessari. (Questa è una parafrasi del messaggio di Kevin Bourillion da quel thread.)
Consiglio a tutti di leggere l'intero thread di posta elettronica. È straordinariamente penetrante e non ha flamage. È abbastanza convincente. All'inizio ho pensato "Sì, ci dovrebbe essere una classe Pair in Java SE" ma quando il thread ha raggiunto la fine avevo cambiato idea.
Si noti tuttavia che JavaFX ha la classe javafx.util.Pair . Le API di JavaFX si sono evolute separatamente dalle API di Java SE.
Come si può vedere dalla domanda collegata Qual è l'equivalente della coppia C ++ in Java? c'è un ampio spazio di progettazione che circonda quella che è apparentemente un'API così semplice. Gli oggetti dovrebbero essere immutabili? Dovrebbero essere serializzabili? Dovrebbero essere comparabili? La classe dovrebbe essere definitiva o no? I due elementi devono essere ordinati? Dovrebbe essere un'interfaccia o una classe? Perché fermarsi a coppie? Perché non triple, quadruple o N-tuple?
E ovviamente c'è l'inevitabile denominazione in moto per gli elementi:
- (a, b)
- (primo secondo)
- (sinistra destra)
- (auto, cdr)
- (foo, bar)
- eccetera.
Un grosso problema che è stato appena menzionato è il rapporto tra coppie e primitivi. Se si dispone di un (int x, int y)
dato che rappresenta un punto nello spazio 2D, rappresentandolo come si Pair<Integer, Integer>
consumano tre oggetti anziché due parole a 32 bit. Inoltre, questi oggetti devono risiedere nell'heap e dovranno sostenere il sovraccarico GC.
Sembrerebbe chiaro che, come i flussi, sarebbe essenziale che esistessero specializzazioni primitive per le coppie. Vogliamo vedere:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Anche un IntIntPair
richiederebbe comunque un oggetto sull'heap.
Questi, ovviamente, ricordano la proliferazione di interfacce funzionali nel java.util.function
pacchetto in Java SE 8. Se non si desidera un'API gonfiata, quali si tralasciano? Potresti anche sostenere che questo non è abbastanza e che Boolean
dovrebbero essere aggiunte anche specializzazioni per, diciamo ,.
La mia sensazione è che se Java avesse aggiunto una classe Pair molto tempo fa, sarebbe stato semplice, o anche semplicistico, e non avrebbe soddisfatto molti dei casi d'uso che stiamo immaginando ora. Considera che se Pair fosse stato aggiunto nel time frame JDK 1.0, probabilmente sarebbe stato mutevole! (Guarda java.util.Date.) Le persone ne sarebbero state contente? La mia ipotesi è che se ci fosse una classe Pair in Java, sarebbe una specie di non-davvero-utile e tutti continuerebbero a rotolare per soddisfare le loro esigenze, ci sarebbero varie implementazioni Pair e Tuple in librerie esterne, e la gente continuerebbe a discutere / discutere su come risolvere la classe Pair di Java. In altre parole, un po 'nello stesso posto in cui ci troviamo oggi.
Nel frattempo, è in corso un lavoro per affrontare il problema fondamentale, che è un migliore supporto nella JVM (e infine nel linguaggio Java) per i tipi di valore . Vedi questo documento sullo stato dei valori . Questo è un lavoro preliminare, speculativo, e copre solo questioni dal punto di vista della JVM, ma ha già una buona dose di pensiero. Naturalmente non ci sono garanzie che questo possa entrare in Java 9, o mai entrare da nessuna parte, ma mostra l'attuale direzione di pensiero su questo argomento.
AbstractMap.SimpleImmutableEntry<K,V>
da anni ... Ma comunque, invece di mappaturai
per(i, value[i])
solo per il filtraggio da partevalue[i]
e la mappatura di nuovo ai
: perché non solo filtro,value[i]
in primo luogo, senza la mappatura?