代码之家  ›  专栏  ›  技术社区  ›  Marci-man

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

  •  0
  • Marci-man  · 技术社区  · 7 年前

    mainimport_31052017。csv

    mainimport_15052017。csv

    我有一个模式字符串:

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

    现在我应该下载标题中有最新日期的文件。我应该用Java 8 goodies来做。

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

    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()));
    

    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();
    

    1 回复  |  直到 7 年前
        1
  •  4
  •   Holger    7 年前

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

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