Мне интересно, можно ли использовать диапазон Guava для перебора списка пользовательских объектов.
У меня есть этот пример, который должен получить в списке 5 элементов:
Range<CustomObject> range = Range.closed(customObjectList.get(Auxiliar.index), customObjectList.get(Auxiliar.index + 4));
И тогда я хотел бы повторить этот диапазон, чтобы получить список объектов, я имею в виду, чтобы иметь возможность сделать что-то вроде этого:
List<CustomObject> list = new ArrayList<CustomObject>();
for(CustomObject c : range){
list.add(c)
}
На данный момент я не могу сделать это foreach на хребте Гуава, вместо этого я должен сделать это, как здесь:
for(int grade : ContiguousSet.create(yourRange, DiscreteDomain.integers())) {
...
}
Но здесь проблема в том, что я не могу использовать DiscreteDomain.CustomObject().
Есть ли способ использовать этот диапазон Гуава со списком CustomObject?
Если вы читаете Range
javadoc:
Обратите внимание, что невозможно выполнить итерацию этих содержащихся значений. Для этого передайте экземпляр этого диапазона и соответствующий
DiscreteDomain
дляContiguousSet.create(com.google.common.collect.Range<C>, com.google.common.collect.DiscreteDomain<C>)
.
Поэтому ваш подход правильный, за исключением того, что вам нужно создать пользовательский DiscreteDomain
для вашего настраиваемого объекта:
public class CustomDiscreteDomain extends DiscreteDomain<CustomObject> {
//override and implement next, previous and distance
}
Это может быть или не быть практичным в зависимости от того, что эти объекты.
Упрощенный пример с помощью LocalDate
(возможно, потребуется дополнительная проверка привязки, проверка LocalDate
и т.д.):
public static class LocalDateDiscreteDomain extends DiscreteDomain<LocalDate> {
@Override public LocalDate next(LocalDate value) {
return value.plusDays(1);
}
@Override public LocalDate previous(LocalDate value) {
return value.minusDays(1);
}
@Override public long distance(LocalDate start, LocalDate end) {
return DAYS.between(start, end);
}
}
DiscreteDomain
является абстрактным классом ... Однако ваш пользовательский объект, похоже, не позволит вам реализовать методnext()
иprevious()
этого класса. Наличие кода этого класса позволит получить более подробный ответ.