Java Lambda表达式是否使用“隐藏”或本地包导入?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java Lambda表达式是否使用“隐藏”或本地包导入?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3118字,纯文字阅读大概需要5分钟。
内容图文
这个问题是关于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的一个实例,我认为它的实现包含在java.nio.file.Path包中,尽管该包没有导入.
现在,如果我进行一些小修改,请将对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’导入java.nio.file.Path,否则我会收到编译器错误.
所以我的问题是:
>如果filePath确实是java.nio.file.Path的一个实例,为什么我不需要在第一个例子中导入它,并且
>如果使用lambda表达式执行“隐藏”下的导入,那么当我创建一个以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的实例并将其传递给另一个方法而没有引用其类型名称,因此您不需要导入.此外,您调用varargs方法接受任意数量的FileVisitOption实例.您没有指定任何内容,因此您的代码将创建一个零长度的FileVisitOption []数组,并再次将其传递给Files.walk,而无需导入.
利用改进的类型推断,还可以使用类型而不参考其名称,例如,如果你打电话:
Files.newByteChannel(path, new HashSet<>());
您不仅要为varargs参数创建零长度的FileAttribute []数组,而不是按名称引用此类型,您还要创建一个HashSet< OpenOption>没有按名称引用OpenOption类型.因此,这也不需要导入java.nio.file.attribute.FileAttribute和java.nio.file.OpenOption.
所以最重要的是,无论你是否需要导入都不依赖于类型的使用,而是你是否通过它的简单名称来引用它(并且有多种方法可以使用类型而不是通过名称引用它).在第二个示例中,您指的是方法printPath中的名称Path(Path passedFilePath);如果将其更改为printPath(Object passedFilePath),则所有内容都将重新运行,而无需显式导入java.nio.file.Path.
内容总结
以上是互联网集市为您收集整理的Java Lambda表达式是否使用“隐藏”或本地包导入?全部内容,希望文章能够帮你解决Java Lambda表达式是否使用“隐藏”或本地包导入?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。