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

查看:138
本文介绍了java - 关于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类:

  • 引用静态方法
    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;
}

这篇关于java - 关于jdk8中方法引用的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆