java.time
我建议您使用现代日期时间 API 来完成。根据您的要求,您可以获得Integer、String、Year等形式的年份列表。
演示:
import java.time.LocalDate;
import java.time.Year;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> dates = List.of("2012-05-16", "2012-05-18", "2012-06-19",
"2013-01-18", "2013-01-10", "2013-08-05", "2010-07-10");
List<Integer> yearsIntList =
dates.stream()
.map(LocalDate::parse)
.map(d -> d.getYear())
.collect(Collectors.toList());
List<String> yearsStrList =
dates.stream()
.map(LocalDate::parse)
.map(d -> String.valueOf(d.getYear()))
.collect(Collectors.toList());
List<Year> yearsYearList =
dates.stream()
.map(LocalDate::parse)
.map(d -> Year.of(d.getYear()))
.collect(Collectors.toList());
System.out.println(yearsIntList);
System.out.println(yearsStrList);
System.out.println(yearsYearList);
}
}
输出:
[2012, 2012, 2012, 2013, 2013, 2013, 2010]
[2012, 2012, 2012, 2013, 2013, 2013, 2010]
[2012, 2012, 2012, 2013, 2013, 2013, 2010]
ONLINE DEMO
请注意,您的所有日期字符串均采用 ISO 8601 格式。现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要明确使用 DateTimeFormatter 对象。
通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。
注意:
如果您需要独特的年份集合,请在收集 Stream 之前使用 .distinct(),例如
List<String> yearsStrList =
dates.stream()
.map(LocalDate::parse)
.map(d -> String.valueOf(d.getYear()))
.distinct()
.collect(Collectors.toList());
输出:
[2012, 2013, 2010]
ONLINE DEMO
* 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring。请注意,Android 8.0 Oreo 已经提供了support for java.time。