ОБНОВЛЕНИЕ: Этот ответ является ответом на оригинальный вопрос: есть ли в Java SE 8 пары или кортежи? (И неявно, если нет, почему бы и нет?) ОП обновил вопрос более полным примером, но кажется, что его можно решить без использования какой-либо структуры Pair. [Примечание от ОП: вот другой правильный ответ .]
Краткий ответ: нет. Вы должны либо свернуть свою собственную, либо ввести одну из нескольких библиотек, которая ее реализует.
Наличие Pair
класса в Java SE было предложено и отклонено по крайней мере один раз. Смотрите эту ветку обсуждения в одном из списков рассылки OpenJDK. Компромиссы не очевидны. С одной стороны, существует много реализаций Pair в других библиотеках и в коде приложения. Это демонстрирует необходимость, и добавление такого класса в Java SE увеличит повторное использование и совместное использование. С другой стороны, наличие класса Pair увеличивает соблазн создания сложных структур данных из пар и коллекций без создания необходимых типов и абстракций. (Это парафраз сообщения Кевина Буриллиона из этой ветки .)
Я рекомендую всем прочитать всю эту электронную почту. Это удивительно проницательно и не имеет никакого пламени. Это довольно убедительно. Когда он начался, я подумал: «Да, в Java SE должен быть класс Pair», но к тому времени, когда поток достиг своего конца, я передумал.
Однако обратите внимание, что JavaFX имеет класс javafx.util.Pair . API JavaFX развивались отдельно от API Java SE.
Как видно из связанного вопроса, что является эквивалентом пары C ++ в Java? Существует довольно большое пространство дизайна, окружающее, по-видимому, такой простой API. Должны ли объекты быть неизменными? Должны ли они быть сериализуемыми? Должны ли они быть сопоставимы? Класс должен быть окончательным или нет? Стоит ли заказывать два элемента? Должен ли это быть интерфейс или класс? Зачем останавливаться на парах? Почему не тройки, четверки или N-кортежи?
И, конечно же, существует неизбежная система именования элементов:
- (а, б)
- (первая секунда)
- (лево право)
- (автомобиль, CDR)
- (фу, бар)
- и т.п.
Одна большая проблема, которая едва упоминалась, - это отношение пар к примитивам. Если у вас есть (int x, int y)
геодезический , которая представляет собой точку в 2D пространстве, представляя это как Pair<Integer, Integer>
потребляет три объекта вместо двух 32-битных слов. Кроме того, эти объекты должны находиться в куче и подвергаться GC-нагрузке.
Казалось бы, ясно, что, как и в Streams, важно, чтобы существовали примитивные специализации для пар. Хотим ли мы увидеть:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
Даже IntIntPair
если все равно потребуется один объект в куче.
Это, конечно, напоминает распространение функциональных интерфейсов в java.util.function
пакете в Java SE 8. Если вы не хотите раздутого API, какие из них вы бы оставили? Вы также можете утверждать, что этого недостаточно, и что специализации, скажем, также Boolean
следует добавить.
У меня такое ощущение, что если бы Java давно добавила класс Pair, это было бы просто или даже упрощенно, и это не удовлетворило бы многие варианты использования, которые мы предполагаем сейчас. Учтите, что если бы Pair был добавлен во временные рамки JDK 1.0, он, вероятно, был бы изменчивым! (Посмотрите на java.util.Date.) Будут ли люди довольны этим? Я предполагаю, что если бы в Java существовал класс Pair, он был бы своего рода не очень полезным, и каждый все равно будет крутить свои собственные, чтобы удовлетворить свои потребности, во внешних библиотеках были бы различные реализации Pair и Tuple, и люди все еще будут спорить / обсуждать, как исправить класс Pair в Java. Другими словами, вроде в том же месте, в котором мы находимся сегодня.
Между тем, продолжается работа по решению фундаментальной проблемы, которая заключается в улучшении поддержки в JVM (и в конечном итоге в языке Java) для типов значений . Смотрите этот документ о состоянии ценностей . Это предварительная, умозрительная работа, и она охватывает только вопросы с точки зрения JVM, но за ней уже стоит немало идей. Конечно, нет никаких гарантий, что это войдет в Java 9 или когда-нибудь проникнет, но это показывает текущее направление мышления по этой теме.
AbstractMap.SimpleImmutableEntry<K,V>
течение многих лет ... Но в любом случае, вместо отображения ,i
чтобы(i, value[i])
только для фильтрации поvalue[i]
и отображению обратноi
: почему не только фильтр,value[i]
в первую очередь, без отображения?