ОБНОВЛЕНИЕ: Этот ответ является ответом на исходный вопрос: Есть ли в Java SE 8 пары или кортежи? (И если нет, то почему бы и нет неявно?) OP обновлен вопрос с более полным примером, но похоже, что он может быть решен без использования какой-либо парной структуры. [Примечание от OP: вот другой правильный ответ.]
Краткий ответ: нет. Вы должны либо использовать свой собственный, либо использовать одну из нескольких библиотек, которые его реализуют.
Наличие класса Pair в Java SE было предложено и отвергнуто по крайней мере один раз. См. эту ветку обсуждения на одном из списки рассылки OpenJDK. Компромиссы не очевидны. С одной стороны, существует множество реализаций Pair в других библиотеках и в коде приложения. Это демонстрирует необходимость, и добавление такого класса в Java SE увеличит повторное использование и совместное использование. С другой стороны, наличие класса Pair добавляет соблазна создавать сложные структуры данных из пар и коллекций без создания необходимых типов и абстракций. (Это пересказ сообщения Кевина Буриллиона из той ветки.)
Я рекомендую всем прочитать всю эту цепочку писем. Это удивительно проницательно и без оглядки. Вполне убедительно. Когда это началось, я подумал: «Да, в Java SE должен быть класс Pair», но к тому времени, когда поток достиг своего конца, я передумал.
Однако обратите внимание, что JavaFX имеет javafx.util.Pair класс. API-интерфейсы JavaFX развивались отдельно от API-интерфейсов Java SE.
Как видно из связанного вопроса Что такое эквивалент пары C ++ в Java? очевидно, что такой простой API окружает довольно большое пространство дизайна. Должны ли объекты быть неизменными? Должны ли они быть сериализуемыми? Должны ли они быть сопоставимы? Занятие должно быть окончательным или нет? Следует ли заказывать два элемента? Это должен быть интерфейс или класс? Зачем останавливаться на парах? Почему не тройки, квадраты или N-кортежи?
И, конечно же, существует неизбежное именование элементов велосипедной навесы:
- (a, b)
- (первая секунда)
- (лево право)
- (автомобиль, cdr)
- (фу, бар)
- и Т. Д.
Одна большая проблема, о которой почти не упоминалось, - это отношение пар к примитивам. Если у вас есть (int x, int y) датум, представляющий точку в двухмерном пространстве, то представление Pair<Integer, Integer> потребляет три объекта вместо двух 32-битных слов. Кроме того, эти объекты должны находиться в куче и будут вызывать накладные расходы сборщика мусора.
Казалось бы, очевидно, что, как и в случае с потоками, для пар необходимо наличие примитивных специализаций. Хотим ли мы увидеть:
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 во внешних библиотеках, и люди все еще спорили / обсуждали, как исправить класс Java Pair. Другими словами, примерно в том же месте, где мы находимся сегодня.
Между тем ведется некоторая работа по решению фундаментальной проблемы, а именно лучшей поддержки в JVM (и, в конечном итоге, в языке Java) для типов значений. См. Этот документ Состояние значений. Это предварительная, спекулятивная работа, и она охватывает только проблемы с точки зрения JVM, но за ней уже стоит изрядное количество размышлений. Конечно, нет никаких гарантий, что это войдет в Java 9 или когда-либо попадет куда-нибудь, но это действительно показывает текущее направление мышления по этой теме.
person
Stuart Marks
schedule
20.06.2014
AbstractMap.SimpleImmutableEntry<K,V>… Но в любом случае, вместо сопоставленияiс(i, value[i])только для фильтрации поvalue[i]и обратного сопоставления сi: почему бы просто не отфильтровать поvalue[i]в первую очередь, без сопоставления? - person Holger   schedule 20.06.2014iв потоке. Мне также нужноvalue[i]для критериев. Вот почему мне нужно(i, value[i])- person necromancer   schedule 21.06.2014[0, 2, 4]? - person Stuart Marks   schedule 21.06.2014