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

时间:2017-03-17 15:22:41

标签: 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-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());
}

3 个答案:

答案 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()));
 };

相关jls-section

如果你想要删除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);