我正在尝试在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());
}
答案 0 :(得分:2)
如果你满足于将read-me存储为数组中的最后一个值,那么为此目的更改Comparator
可能会有效。
(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()));
};
如果你想要删除README文件,你必须将其过滤掉(我们都喜欢Java8,所以这里是流版本):
File[] sorted = Arrays.stream(listOfFiles).filter(f->!f.getName().equals("README.txt")).
sort(Comparator.comparing(File::getName, String::compareToIgnoreCase)).
toArray(File[]::new);
答案 1 :(得分:2)
无法在排序过程中从集合中删除元素。
现在,您可以在列出文件夹中的文件时提供FileFilter作为lambda表达式:
<resources>
<resource>
<directory>src/main/resources/ebextensions</directory>
<targetPath>.ebextensions</targetPath>
<filtering>true</filtering>
</resource>
<!-- Followed is copied from `spring-boot-starter-parent.pom` -->
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/application*.yml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
顺便说一句:使用提取器排序元素更优雅(恕我直言):
File.listFiles(f -> f.getName().equals("README.txt"));
答案 2 :(得分:1)
排序数组不足以摆脱README.txt,你需要过滤
排序后你需要:List<File> result = Arrays.asStream(listOfFiles)
.filter(x -> !"readme.txt".equalsIgnoreCase(x.getName()))
.collect(Collectors.toList());
result.forEach(System.out::println);