Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA8:查找文件名中包含最新日期的文件_Java_Collections_Java 8 - Fatal编程技术网

JAVA8:查找文件名中包含最新日期的文件

JAVA8:查找文件名中包含最新日期的文件,java,collections,java-8,Java,Collections,Java 8,我在FTP文件夹中有几个文件,名称如下: mainimport_31052017.csv mainimport_21052017.csv mainimport_15052017.csv 我有一个模式字符串: 字符串模式=“mainport\u ddmmyyy” 现在我应该下载标题中有最新日期的文件。我应该用Java8来做这件事 我有一个解决方案,但这还不够漂亮,我用两种说法来说明: 1) 我首先得到最新的日期: Date newestDate = Collections.max(ftpFiles

我在FTP文件夹中有几个文件,名称如下:

mainimport_31052017.csv
mainimport_21052017.csv
mainimport_15052017.csv

我有一个模式字符串:

字符串模式=“mainport\u ddmmyyy”

现在我应该下载标题中有最新日期的文件。我应该用Java8来做这件事

我有一个解决方案,但这还不够漂亮,我用两种说法来说明:

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 file=ftpFiles.stream().filter(文件名->{
字符串fileNameSuffix=fileName.getName().split(“”)[1];
日期=空;
试一试{
date=dateFormat.parse(fileNameSuffix);
}捕获(解析异常){
e、 printStackTrace();
}
返回StringUtils.startsWith(fileName.getName(),前缀)和&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")));
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);
                }
            }));

如果日期格式是不可避免的先决条件,则可以使用

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")));
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);
                }
            }));

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

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")));
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);
                }
            }));

如果日期格式是不可避免的先决条件,则可以使用

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")));
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);
                }
            }));

“不够漂亮”的工作代码不属于堆栈溢出。如果你想使用Java 8“goodies”,那么你不应该使用
Date
Calendar
类,而应该使用
Java.time
包及其子包或“yoda time”,因为几乎所有的事情都比使用日历和日期好^^^只是一个提示:您可以在流上调用
max
,而不是收集到
列表中,并将该
List
传递到
Collections.max
。如果您提供了一个比较日期的
比较器
,您就可以首先获得文件。无需使用
Date
java.time
;只需使用直接作用于文件名的
比较器
。如果你想使用Java 8“goodies”,那么你不应该使用
Date
Calendar
类,而应该使用
Java.time
包及其子包或“yoda time”,因为几乎所有的事情都比使用日历和日期好^^^只是一个提示:您可以在流上调用
max
,而不是收集到
列表中,并将该
List
传递到
Collections.max
。如果您提供了一个比较日期的
比较器
,您就可以首先获得文件。无需使用
Date
java.time
;只需使用一个直接作用于文件名的
比较器就可以了。这看起来很有趣,但文件名可以更改,我的意思是,它可以是mmddyy或ddmmyy或其他什么,所以我首先尝试将它转换为date。@Marci man:没有解析器能神奇地检测出你是指
mmddyy
还是
ddmmyy
,因此,在任何情况下都必须重新配置解析器。在我的回答中,使用
mmddyyyy
而不是
ddmmyyyy
就像将
“$3$2$1”
更改为
“$3$1$2”
一样简单。当然,只有在您了解了它的功能之后,才可以维护它。调整它以支持
yy
以及
yyy
会有点困难,但我强烈反对使用两位数的年份。但是,您可以使用
比较器。比较
来创建基于
日期
解析器的比较器,效率会稍低。不,这不是我的意思,我事先得到了一个格式:mainport_ddmmyy。这段信息已经存在。这看起来很有趣,但是文件名可以更改,我的意思是,它可以是mmddyy或ddmmyy或其他任何东西,所以我尝试先将其转换为日期。@Marci man:没有解析器能神奇地检测出您的意思是
mmddyy
还是
ddmmyy
,因此,在任何情况下都必须重新配置解析器。在我的回答中,使用
mmddyyyy
而不是
ddmmyyyy
就像将
“$3$2$1”
更改为
“$3$1$2”
一样简单。当然,只有在您了解了它的功能之后,才可以维护它。调整它以支持
yy
以及
yyy
会有点困难,但我强烈反对使用两位数的年份。但是,您可以使用
比较器。比较
来创建基于
日期
解析器的比较器,效率会稍低。不,这不是我的意思,我事先得到了一个格式:mainport_ddmmyy。这条信息已经存在了。