gpt4 book ai didi

JAVA8 : Find the file with the newest date in its filename

转载 作者:行者123 更新时间:2023-12-01 17:54:37 25 4
gpt4 key购买 nike

我的 FTP 文件夹中几乎没有文件,其名称如下:

mainimport_31052017.csv
mainimport_21052017.csv
mainimport_15052017.csv

我有一个模式字符串:

String pattern = "mainimport_ddmmyyy";

现在我应该下载标题中包含最新日期的文件。我应该用 Java 8 来做到这一点。

我有一个解决方案,但这还不够漂亮,我用两条语句来实现:

1)我首先得到最新的日期:

Date newestDate = Collections.max(ftpFiles.stream().filter(fileName -> StringUtils.startsWith(fileName.getName(), prefix)).map(fileName -> {
String fileNameSuffix = fileName.getName().split("_")[1];
Date date = null;
try {
date = dateFormat.parse(fileNameSuffix);
} catch (ParseException e) {
e.printStackTrace();
}

return date;
}).collect(Collectors.toList()));

2)然后我得到带有最新日期的文件名:

Optional<FTPFile> file = ftpFiles.stream().filter(fileName->{
String fileNameSuffix = fileName.getName().split("_")[1];
Date date = null;
try {
date = dateFormat.parse(fileNameSuffix);
} catch (ParseException e) {
e.printStackTrace();
}
return StringUtils.startsWith(fileName.getName(), prefix) && date.equals(newestDate);

}).findFirst();

如果可能的话,我尝试在一个语句中完成这两个任务。

最佳答案

假设日期始终具有指定的六字符表示形式,您可以使用

Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> file.getName()
.replaceFirst(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*", "$3$2$1")));

工厂方法Comparator.comparing允许您基于属性创建一个Comparator,这样最大元素将是该属性具有最大值的元素.

请注意,这只是将 ddmmyyyy 格式的日期转换为 yyyymmdd 字符串,该字符串可以按字典顺序进行比较,只要日期和月份始终有两个 -数字形式,即带有前导零。

您可以通过准备和重用正则表达式模式对此进行一些优化:

Pattern pattern = Pattern.compile(".*_([0-9]{2})([0-9]{2})([0-9]{4}).*");
Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file ->
pattern.matcher(file.getName()).replaceFirst("$3$2$1")));
<小时/>

如果DateFormat是不可避免的先决条件,您可以使用

Optional<FTPFile> max = ftpFiles.stream()
.filter(file -> file.getName().startsWith(prefix))
.max(Comparator.comparing(file -> {
String name = file.getName();
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}));

这会一次性执行该操作,但缺点是在比较期间执行的解析操作超出了必要的范围。如果你想避免这种情况,你可以采用原来的两遍设计,但你仍然不需要收集到 List 中:

ftpFiles.stream()
.map(FTPFile::getName)
.filter(name -> name.startsWith(prefix))
.map(name -> {
name = name.substring(name.indexOf('_')+1);
try {
return dateFormat.parse(name);
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
})
.max(Comparator.naturalOrder())
.map(date -> prefix+'_'+dateFormat.format(date))
.flatMap(fileName -> ftpFiles.stream()
.filter(file -> file.getName().equals(fileName)).findAny())
.ifPresent(System.out::println);

关于JAVA8 : Find the file with the newest date in its filename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com