Java 在Lambda表达式中使用if语句对数组进行排序

Java 在Lambda表达式中使用if语句对数组进行排序,java,lambda,Java,Lambda,我试图在我的Java项目中使用Lambda表达式。我的代码从文件夹中读取文件,将其存储在数组中并按降序排序。其他方法将使用此代码获取包含最新日期的文件 Arrays.sort(listOfFiles, (File file1, File file2) -> file2.getName().compareToIgnoreCase(file1.getName())); 输出为: README.txt forecast-project-export-from-2017-03-06-to-201

我试图在我的Java项目中使用Lambda表达式。我的代码从文件夹中读取文件,将其存储在数组中并按降序排序。其他方法将使用此代码获取包含最新日期的文件

Arrays.sort(listOfFiles, (File file1, File file2) -> file2.getName().compareToIgnoreCase(file1.getName()));
输出为:

README.txt
forecast-project-export-from-2017-03-06-to-2017-03-10.csv
forecast-project-export-from-2017-02-27-to-2017-03-03.csv
forecast-project-export-from-2017-02-20-to-2017-02-24.csv
forecast-project-export-from-2017-02-13-to-2017-02-17.csv
forecast-project-export-from-2017-02-06-to-2017-02-10.csv
forecast-project-export-from-2017-01-30-to-2017-02-03.csv
forecast-project-export-from-2017-01-23-to-2017-01-27.csv
输出是正确的,但是文件夹包含一个README.txt文件,我希望忽略该文件,或者不将其作为数组的元素[0]。是否有一种方法可以使用
if
语句,该语句仅对名称包含“forecast project export from”的元素进行排序。大概是这样的:

if (o1.getName().contains("forecast-project-export-from") && o2.getName().contains("forecast-project-export-from")) {
     return o2.getName().compareToIgnoreCase(o1.getName());
}

对数组进行排序不足以清除README.txt,您需要进行筛选

排序后,您将需要:

List<File> result = Arrays.asStream(listOfFiles)            
    .filter(x -> !"readme.txt".equalsIgnoreCase(x.getName()))   
    .collect(Collectors.toList());          

result.forEach(System.out::println);
List result=Arrays.asStream(listOfFiles)
.filter(x->!“readme.txt”.equalsIgnoreCase(x.getName()))
.collect(Collectors.toList());
result.forEach(System.out::println);

如果您满足于将read me存储为数组中的最后一个值,那么为此更改
比较器可以起作用

(File file1, File file2) -> {
    if(file1.getName().equals("README.txt"))
         return 1;  //readme-file is always "greater" than other files
    if(file2.getName().equals("README.txt"))
         return -1;
    else 
        return file2.getName().compareToIgnoreCase(file1.getName()));
 };
相关的

但是,如果您想删除自述文件,则必须将其过滤掉(我们都喜欢Java8,所以这里是流版本):


排序期间无法从集合中删除元素

现在,在列出文件夹中的文件时,可以将文件筛选器作为lambda表达式提供:

File.listFiles(f -> f.getName().equals("README.txt"));
顺便说一下:使用提取器对元素进行排序要优雅得多(IMHO):


您可以使用if,但这对您的文件没有帮助。您需要从实际输入中删除文件。您可以使用streams对其进行如下排序:
tmp.stream().filter(x->x.startsWith(“我的前缀”).sorted((k1,k2)->k1.compareTo(k2)).collect(Collectors.toList())我认为您可以过滤列表文件以删除未使用的文件,然后对列表进行排序。虽然您提到排除
README.txt
文件,但听起来您实际想要做的似乎是只包括与模式匹配的文件
预测项目导出自--to-.csv
。当前,只有问题文件中存在
README.txt
,但如果仅排除该文件,则如果文件夹中添加了另一个“坏”文件,则代码可能会再次中断。因此,给出的
过滤器
示例是一个很好的起点,但我会对您想要的文件进行包含式过滤器,而不是对当前已知的文件进行独占式过滤器。另外,您如何获得文件列表?因为在这一点上还有过滤的潜力,例如:
folder.list((dir,filename)->filename.matches(“预测项目从-\\d{4}-\\d{2}-\\d{2}-导出到-\\d{4}-\\d{2}-\\d{2}\\\.csv”)
@lukens我用Paul的代码过滤掉了这个文件,如果有其他名称的文件,没关系,我只是不想让它成为数组的第0个元素。原因是我的其他方法希望获取具有最新日期的文件以进行一些处理。这些文件是在一个单独的项目中使用Selenium WebDriver下载的,Jenkins将这些文件复制到当前目录中。您的流示例不会导致只有一个自述文件的流吗?@sylvester sry,我的错。我会纠正的。感谢您指出:)这不应该是
.sorted(Comparator.comparing(File::getName)
?您可以将
sort(Comparator.comparing(File::getName))
更新为
sorted(Comparator.comparing(File::getName,String::compareTignorecase))
@pratikpncl并不重要。它比较短(几分钟前我已经更新了答案),但从技术上讲,它不会改变行为,因为相同的函数将用于比较。它只是更详细(不必要)
File.listFiles(f -> f.getName().equals("README.txt"));
listOfFiles.sort(Comparator.comparing(File::getName));