Примитивная альтернатива Guava Table
Есть ли альтернатива таблицам Guava, которая использует примитивы вместо универсальных типов в качестве ключей?
Я хотел бы использовать примитивы, чтобы избежать автобокс, вызванный использованием Java Numbers и дополнительных объектов ввода, созданных Java Maps.
Я свернул свой собственный базовый LongLongObjectTable, используя Trove TLongObjectMap, но предпочел бы использовать стандартную библиотеку, если она доступна.
private static class LongLongObjectTable<T> {
private final TLongObjectMap<TLongObjectMap<T>> backingMap = new TLongObjectHashMap<>();
T get(final long rowKey, final long columnKey) {
final TLongObjectMap<T> map = this.backingMap.get(rowKey);
if (map == null) {
return null;
}
return map.get(columnKey);
}
void put(final long rowKey, final long columnKey, final T value) {
TLongObjectMap<T> map = this.backingMap.get(rowKey);
if (map == null) {
map = new TLongObjectHashMap<>();
this.backingMap.put(rowKey, map);
}
map.put(columnKey, value);
}
Collection<T> values() {
final List<T> values = new ArrayList<T>();
for (final TLongObjectMap<T> map : this.backingMap.valueCollection()) {
values.addAll(map.valueCollection());
}
return values;
}
}
1 ответ
На самом деле, нет. Проблема состоит в том, что такие реализации неизбежно не являются общими (по определению) и должны быть определены один за другим. Это означает значительное повторение и потенциально много возможных перестановок коллекции.
Тем не менее, другие языки допускают это, заставляя компилятор генерировать код для экземпляров коллекции с типом T, а не использовать стирание типа, но это не то направление, в котором пошла Java.
Тот факт, что в существующей коллекции можно использовать автоматически упакованные варианты, такие как Long или Integer, достаточно для подавляющего большинства случаев, поскольку накладные расходы относительно невелики. Кроме того, дизайнеры стандартной библиотеки, вероятно, предпочитают держать ее стройной, а не загрязнять ее дополнительными пользовательскими вариантами.