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

发布于 2022-09-02 14:38:26 字数 1092 浏览 15 评论 0

今天看书,讲道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我真的是没有明白,到底该怎么改呢?
求大神带一下!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

笨笨の傻瓜 2022-09-09 14:38:26

方法引用分为4类:

  • 引用静态方法
    Class::staticMethodName

例子: (str) -> Integer.valueOf(str),对应 Integer::valueOf
  • 引用特定对象的实例方法
    Instance::instanceMethodName

例子: (collection) -> list.addAll(collection),对应 list::addAll
  • 引用特定类型的的方法
    Type::methodName

例子: (file) -> file.isDirectory,对应 File::isDirectory
  • 引用构造函数
    Class::new

例子: () -> 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文