Una instancia de archivo necesita ser construido dentro de una expresión lambda para la interfaz FilenameFilter

Mutante Algoritmo:

Supongamos que tengo la siguiente estructura de directorios para mi prueba.

test
|
|
---test1
|
|
---test2
|
|
---random.txt

En esta estructura, test1 y test2 son directorios, mientras que random.txt es un archivo normal.

Quiero escribir una función que me dará una lista de todos los subdirectorios dado una ruta de archivo.

Intentará 1, obras (sin expresión lambda)

private static ArrayList<String> subDirectories(File pathname) {
    ArrayList<String> subdirectories = new ArrayList<>();

    for(File file : pathname.listFiles()) {
        if(file.isDirectory())
            subdirectories.add(file.getName());
    }

    return subdirectories;
}

Esto devuelve correctamente test1 y test2 como subdirectorios.

Intento 2: el uso de la expresión lambda

private static String[] subDirectories(File pathname) {
    return pathname.list((dir, name) -> dir.isDirectory());
}

Este resultado incluye ahora random.txt como un directorio, lo que claramente no lo es. ¿Por qué es la función con lambda dando un resultado diferente?

EDITAR:

Sólo funciona cuando se crea una instancia de archivo en la expresión lambda:

return pathname.list((dir, name) -> new File(dir, name).isDirectory());

dir ya es un objeto File sin embargo, ¿por qué estamos creando una instancia del archivo desde una instancia del archivo existente?

EDIT 2:

Después de buscar en la documentación, el dirparámetro siempre se refiere al directorio en el que se encuentra el archivo. Es por esto que random.txtse devuelve como el nombre de un directorio. Pero todavía no sé por qué es necesaria la creación de una nueva instancia del archivo.

también:

Al igual que en su intento existente:

private static List<String> subDirectories(File pathname) {
    return Arrays.stream(pathname.listFiles())
                   .filter(File::isDirectory)
                   .map(File::getName)
                   .collect(Collectors.toList());
}

La razón por la cual las listas de soluciones lambda random.txtes el uso de FilenameFilterla que utiliza parámetros como:

/**
 * 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.
 * @return  true if and only if the name should be
 *          included in the file list; false otherwise.
 */
boolean accept(File dir, String name);

como se puede relacionar testes un directorio y por eso random.txtse filtra a la salida .


Editar : Usando

return pathname.list((dir, name) -> new File(dir, name).isDirectory());

funciona ya que, de haber creado un archivo y no un directorio con el nombre random.txt. La razón por la que no es un directorio se afirma en el javadoc

Si el padre es el vacío vía de acceso abstracta continuación, la nueva instancia del archivo se crea convirtiendo niño en una vía de acceso abstracta y resolver el resultado contra un directorio predeterminado depende del sistema.

que en su caso no ocurre, ya que existe el directorio padre.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=364270&siteId=1
Recomendado
Clasificación