当前位置: 首页 > 面试题库 >

Java Lambda表达式是否使用“隐藏”或本地包导入?

西门山
2023-03-14
问题内容

这个问题与lambda表达式似乎使用的Java包的明显“隐藏”或本地导入有关。

以下示例代码可以编译并正常运行(它只列出了给定目录中的文件):

package com.mbm.stockbot;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Temp2 {
    public static void main(String[] args) {
        Temp2 t = new Temp2();
        t.readDir();
    }

    public void readDir() {
        try {
            Files.walk(Paths.get("C:/Users/mbmas_000/Downloads/SEC Edgar"), 1).forEach(filePath -> {
                if (Files.isRegularFile(filePath)) {
                    System.out.println(filePath);
                }
            });
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }
}

请注意,该变量filePath是的实例Path,我认为其实现包含在package中java.nio.file.Path,尽管import该包没有。

现在,如果我进行了一些小的修改,请说重构System.out.println对它自己方法的调用:

package com.mbm.stockbot;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Temp2 {

    public static void main(String[] args) {
        Temp2 t = new Temp2();
        t.readDir();
    }

    public void readDir() {
        try {
            Files.walk(Paths.get("C:/Users/mbmas_000/Downloads/SEC Edgar"), 1).forEach(filePath -> {
                if (Files.isRegularFile(filePath)) {
                    printPath(filePath);
                }
            });
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    public void printPath(Path passedFilePath) {
        System.out.println(passedFilePath);
    }
}

我现在必须’import’ import java.nio.file.Path,否则会出现编译器错误。

所以我的问题是:

  1. 如果filePath的确是一个实例java.nio.file.Path,为什么 不要 我需要导入它在第一个例子,

  2. 如果使用lambda表达式执行进口“在幕后”,那么为什么 我需要添加import,当我创建需要的实例的方法Path作为参数?

可用于调用filePath和的方法passedFilePath是相同的,使我相信它们都是的实例java.nio.file.Path


问题答案:

import声明并不意味着声明您的代码正在使用什么类;他们只是声明用来解析不合格标识符的内容。因此,如果您Path在代码中使用了非限定标识符,则必须import java.nio.file.Path;声明该标识符应解析为该限定类型。顺便说一下,这不是解析名称的唯一方法。名称也可以通过类继承来解析,例如,如果它们与继承的成员类的简单名称匹配。

如果隐式使用类型而不引用其名称,则不需要import声明,这不仅限于lambda表达式,它甚至不是Java 8的特殊功能。例如,

Files.walk(Paths.get("C:/Users/mbmas_000/Downloads/SEC Edgar"), 1)

您已经Path隐式使用了类型,因为它是的返回类型Paths.get和参数类型Files.walk,换句话说,您正在接收的实例java.nio.file.Path并将其传递给另一个方法而无需引用其类型名称,因此您不需要import。此外,您正在调用varargs方法,该方法接受任意数量的FileVisitOption实例。您没有指定任何内容,因此您的代码将创建一个零长度的FileVisitOption[]数组,并将其Files.walk再次传递给,而无需添加import

通过改进的类型推断,还有一种可能使用类型而不引用其名称的可能性,例如,如果您调用:

Files.newByteChannel(path, new HashSet<>());

您不仅FileAttribute[]要为varargs参数创建一个零长度的数组,而不必按名称引用此类型,而且还要创建一个HashSet<OpenOption>OpenOption按名称引用类型的a。因此,这也不要求import
java.nio.file.attribute.FileAttributejava.nio.file.OpenOption

因此,最重要的是,是否需要an
import不取决于类型的使用,而是取决于您是否通过其简单名称来引用它(并且有多种方法可以使用类型而不通过名称来引用它)。在第二个示例中,您将Path在方法中引用名称printPath(Path passedFilePath);如果将其更改为printPath(Object passedFilePath),则无需显式import的,一切都会再次起作用java.nio.file.Path



 类似资料:
  • 问题内容: lambda表达式中使用的变量应该是final或有效的final 当我尝试使用它时会显示此错误。 问题答案: 可变装置,它可以被实例化一次。在Java中,你不能在lambda以及匿名内部类中使用非最终变量。 你可以使用旧的for-each循环来重构代码: 即使我对这段代码有些不了解: 你调用;而不使用其返回值 使用分配,;你不会修改原始传递的内容,并且你不会在此方法中使用它 你总是返回

  • 我最近接触了Java8,我正在尝试学习Lambda表达式。我想做一些图形计算,我的代码到目前为止: 所有这些代码都是用于图形的,除了和使用的操作之外,所有内容都是基本的数学(加、减、乘、模),并且可以单独针对每个像素执行。 现在的问题是:有可能在GPU上运行这个吗?或者这甚至是自动基于GPU的?(我记得在什么地方读到过这个,但我不确定)

  • 我尝试了下面的代码在移动和桌面上以不同的方式显示。但是两个句子同时显示。

  • 问题内容: 多态是采取多种形式的能力。方法重写是运行时多态。 我的问题是: Java中是否有类似静态多态的东西? 可以将方法隐藏视为一种多态形式吗? 在这个问题的答案中,据说静态方法不是多态的。是什么原因呢? 问题答案: 如果我们运行此测试 如果方法x()是多态的,它将打印B。

  • 我有下面的类和对象的ArrayList: 我想要的是从我的列表中得到一个字符串和整数地图,其中包含门票中的目的地和我列表中每个目的地的出现次数。我想它会这样开始,但是我不知道如何继续:

  • 我读了这里的帖子,我的Bootstrap网站,并且疯狂地搜索--但是找不到我确信是一个简单的答案。 我有一个从link_to帮助器打开的引导模式,如下所示: 在我的操作中,我的代码创建然后传递到。在中,我有一些错误处理代码(ruby和javascript的混合)。如果一切顺利,我想关闭模态。 这就是我遇到麻烦的地方。当一切顺利时,我似乎不能放弃模态。 我尝试了,但没有效果。我还尝试过,这会使模态消