首页 > 关于jdk8中方法引用的问题?

关于jdk8中方法引用的问题?

今天看书,讲道JDK8中新增了lambda,可以实现方法引用
例如:System.out::print 等于 System.out.print
但是我还是没有明白,这样做的意义是什么呢?

书中有个练习题
1,使用java.io.File中的listFiles(FileFilter)和isDirectory()这两个方法实现找出某个文件夹下所有子文件夹的功能。
2,使用lambda表达式来代替FileFilter
3,再将它改写为一个方法引用

1和2我基本上完成了,大家可以看代码

public static void main(String[] args) {
        List<File> totalFiles = getSonFiles(new File("F:\\"));
    }

    static List<File> getSonFiles(File f){
        List<File> fileList = new ArrayList<>();
        File[] files = f.listFiles(file -> file.isDirectory());
        if(files == null || files.length == 0){
            return fileList;
        }
        for (File currentFile: files) {
            fileList.add(currentFile);
        }
        List<File> currentSonFiles = new ArrayList<>();
        for (File currentFile: fileList) {
            currentSonFiles.addAll(getSonFiles(currentFile));
        }
        fileList.addAll(currentSonFiles);
        return fileList;
    }

不知道这块代码有没有还需要改进的地方
至于3我真的是没有明白,到底该怎么改呢?
求大神带一下!!!


方法引用分为4类:

例子: (str) -> Integer.valueOf(str),对应 Integer::valueOf
例子: (collection) -> list.addAll(collection),对应 list::addAll
例子: (file) -> file.isDirectory,对应 File::isDirectory
例子: () -> new Object(),对应 Object::new 

你这里属于第三种:

static List<File> getSonFiles(File f) {
        
    //File[] files = f.listFiles(file -> file.isDirectory());
    File[] files = f.listFiles(File::isDirectory); // 方法引用
    
    if (files == null || files.length == 0) {
        return new ArrayList<>(0);
    }
    
    List<File> fileList = new ArrayList<>();
    for (File currentFile : files) {
        fileList.add(currentFile);
    }
    
    List<File> currentSonFiles = new ArrayList<>();
    for (File currentFile : fileList) {
        currentSonFiles.addAll(getSonFiles(currentFile));
    }
    fileList.addAll(currentSonFiles);
    
    return fileList;
}
【热门文章】
【热门文章】