这个问题与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
,否则会出现编译器错误。
所以我的问题是:
如果filePath
的确是一个实例java.nio.file.Path
,为什么 不要 我需要导入它在第一个例子,
如果使用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.FileAttribute
或java.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的混合)。如果一切顺利,我想关闭模态。 这就是我遇到麻烦的地方。当一切顺利时,我似乎不能放弃模态。 我尝试了,但没有效果。我还尝试过,这会使模态消