java匿名类 Lambda表达式练习

java匿名类 Lambda表达式练习

将下面list程序改编为匿名对象的形式,进一步改写为lambda表达式。

题目:
import java.io.*;

public class Main122 {
    public static void main(String args[]) {
        //确定文件夹路径
        File dir = new File("D:\\JAVA_FILE\\IntelliJ\\JavaLzy\\src");
        FileAccept fileAccept = new FileAccept();
        // 确定后缀名为java
        fileAccept.setExtendName("java");
        // 将读入的符合条件的文件名填入数组
        String[] fileName = dir.list(fileAccept);
        // 遍历数组并输出
        for (String name : fileName) {
            System.out.println(name);
        }
    }
}

class FileAccept implements FilenameFilter {
    private String extendName;
    /*确定后缀名为 .s */
    public void setExtendName(String s) {
        extendName = "." + s;
    }

    /*该方法为bool形,判断name的结尾是否为extendName,符合条件则返回1*/
    @Override
    public boolean accept(File dir, String name) {
        return name.endsWith(extendName);
    }
}

参考下列 FilenameFilter接口 定义及 list方法 源码文件。
FilenameFilter接口定义

public interface FilenameFilter {
    /**
     *FilenameFilter是一个接口,如果要用list(FilenameFilter filter)方法必须要实现这样的一个接口
	 *accept()方法会返回一个boolean类型的值,list()方法会根据这个返回值来决定是不是要将某个名字添加到	 * 返回列表中
     * Tests if a specified file should be included in a file list. 
     * 测试如果指定的文件应该包含在文件列表中。
     * @param   dir    the directory in which the file was found.发现该文件的目录。
     * @param   name   the name of the file. 这个file的文件名
     * @return  <code>true</code> if and only if the name should be
     * included in the file list; <code>false</code> otherwise. 
     * 当且仅当该name应包含在文件列表中时True;否则False
     */
    boolean accept(File dir, String name);
}

File类中的list()方法:

//FilenameFilter filter是一个目录过滤器。list(FilenameFilter filter)方法会选择符合条件的文件或文件夹。
public String[] list(FilenameFilter filter) {
        //首先还是调用list()方法,获取指定目录下的全部文件(夹)名字
        String names[] = list();  
        //filter == null说明没有过滤条件
        if ((names == null) || (filter == null)) {  
            return names;
        }
        ArrayList v = new ArrayList();
        //遍历names[]数组中的所有文件(夹)名字
        for (int i = 0 ; i < names.length ; i++) { 
            //如果accept()方法返回真,则添加到ArrayList中
            if (filter.accept(this, names[i])) {   
                v.add(names[i]);
            }
        }
        //将ArrayList转换成String[]类型返回
        return (String[])(v.toArray(new String[v.size()])); 
     }
题解:
  • 本程序功能为遍历某个文件夹中后缀为.java的文件并输出,在File dir=new File(".");中输入我们想要遍历的文件夹路径。
  • 根据题目提供(暗示)的FilenameFilter接口我们可以直接重写accept方法。如下所示:
  1. 匿名类
import java.io.*;

public class Main123 {
    public static void main(String[] args) {
        File dir = new File(".");
        String[] fileName = dir.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".java");
            }
        });
        for (String name : fileName) {
            System.out.println(name);
        }
    }
}

Lambda表达式:


import java.io.File;


public class Main1231 {
    public static void main(String[] args) {
        File dir = new File(".");
        String[] fileName = dir.list((dir1, name) -> name.endsWith(".java"));
        for (String name : fileName) {
            System.out.println(name);
        }
    }
}

所有程序输出结果均为:与实际情况相符合

test.java
test2.java

与实际情况相符合

posted @ 2021-07-10 08:36  SKPrimin  阅读(122)  评论(0编辑  收藏  举报