tl; dr
В 2 строки, используя потоки и лямбда-синтаксис.
Year currentYear = Year.now( ZoneId.of( "Pacific/Auckland" ) ); // Determining the current year requires a time zone when near the ending/beginning of the year.
List < Year > years = // A list of objects of the class `Year`. Better to use a specific type than use a mere integer number.
IntStream // Generates a stream of `int` primitive numbers.
.range( // Get numbers from the specified beginning to the specified ending.
currentYear.getValue() , // Get `int` number of the current year.
currentYear.plusYears( 10 ).getValue() // Yet the `int` number of a later year.
) // Returns a `IntStream` object.
.boxed() // Converts the `int` primitive values into a stream of `Integer` objects.
.map( integer -> Year.of( integer ) ) // Uses each `Integer` object to instantiate a `Year` object. The `Integer` object is auto-boxed back into an `int` primitive`. Primitives cannot be mapped in a stream with a lambda. So we had to do this funky `int` -> `Integer` -> `int` conversion juggling.
.collect( Collectors.toList() ) // Gather the `Year` objects produced by the `map` method into a `List` collection.
;
В несколько строк, используя обычный синтаксис.
Year currentYear = Year.now( ZoneId.of( "Asia/Tokyo" ) ) ;
List< Year > years = new ArrayList<>( 10 ) ;
for( int i = 0 ; i < 10 ; i ++ )
{
years.add( currentYear.plusYears( i ) ) ;
}
См. этот код запускается на IdeOne.com .
years.toString (): [2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029 ]
java.time.Year
Java предлагает определенный класс c для представления года с соответствующим именем Year
. Я предлагаю использовать этот класс, а не просто целое число, чтобы сделать ваш код безопасным для типов и более самодокументируемым.
Часовой пояс имеет решающее значение
Для получения текущего года требуется часовой пояс. На любой данный момент даты различны по всему миру по часовым поясам. Хотя «завтра» в Токио, Япония, это одновременно «вчера» в Монреале-Квебе c.
Следовательно, примерно в последний день / первый день года это может быть "следующий год" в Токио, Япония, и одновременно "последний год" в Монреале-Квебе c. Поэтому при определении текущего года укажите желаемый / ожидаемый часовой пояс.
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Year currentYear = Year.now( z ) ;
Получите следующие десять лет с помощью итерации.
List< Year > years = new ArrayList<>( 10 ) ;
Year year = currentYear ;
for( int i = 0 ; i < 10 ; i ++ )
{
// Remember this year.
years.add( year ) ;
// Set up the next loop.
year = currentYear.plusYears( i ) ;
}
Составьте неизменяемый список из этого ArrayList
, позвонив по номеру List.copyOf
.
List< Year > years = List.copyOf( years ) ; // Returns an unmodifiable `List`, with adding/removing elements disallowed.
java.time.Month
Для истечения года-месяца вам также необходим виджет для выбора месяца. Там вы можете использовать класс Month
.
List< Month > months = List.copyOf( Month.values() )
Метод Month
toString
дает название месяца на английском языке sh в верхнем регистре на основе имени элемента enum. Возможно, вы захотите составить список локализованных имен для отображения пользователям.
List< String > monthsLocalized = new ArrayList<>( months.size() ) ;
Locale locale = Locale.CANADA_FRENCH ;
for( Month month : months )
{
monthsLocalized.add( month.getDisplayName( TextStyle.FULL , locale ) ;
}
monthsLocalized = List.copyOf( monthsLocalized ) ;
java.time.YearMonth
Для получения окончательного результата, когда пользователь выбирает год и месяц, используйте YearMonth
. Как ни странно, фабричные методы YearMonth
не принимают объект Year
, а только целое число. Поэтому позвоните по номеру Year::getValue
.
YearMonth yearMonth = YearMonth.of( selectedYear.getValue() , selectedMonth ) ;
Преждевременная оптимизация
Вы выразили обеспокоенность по поводу оптимизации производительности. Это не тот код, который нужно оптимизировать. Действительно, не попадайтесь в ловушку преждевременной оптимизации. Было показано, что даже самые опытные программисты плохо умеют интуитивно угадывать, где находятся узкие места в их кодовой базе. Оптимизируйте только после того, как эмпирически доказали существенное замедление, которое существенно влияет на производительность вашего кода и работу бизнеса. Чаще всего написание простых простых коротких строк кода Java приводит к высокооптимизированному выполнению кода после того, как компилятор Java и оптимизатор времени выполнения (HotSpot, OpenJ9) выполнят свою работу.
About java .time
Фреймворк java .time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Чтобы узнать больше, см. Учебник Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java .time классы.
Вы можете обмениваться java .time объектами напрямую с вашей базой данных. Используйте драйвер JDB C , совместимый с JDB C 4.2 или более поздней версией. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java .time?