我想知道方法引用和功能接口的所有这些东西如何在较低级别上工作.最简单的例子是我们有一些List
List<String> list = new ArrayList<>();
list.add("b");
list.add("a");
list.add("c"):
Run Code Online (Sandbox Code Playgroud)
现在我们想用Collections类对它进行排序,所以我们可以调用:
Collections.sort(list, String::compareToIgnoreCase);
Run Code Online (Sandbox Code Playgroud)
但是,如果我们定义自定义比较器,它可能是这样的:
Comparator<String> customComp = new MyCustomOrderComparator<>();
Collections.sort(list, customComp::compare);
Run Code Online (Sandbox Code Playgroud)
问题是Collections.sort有两个参数:List和Comparator.由于Comparator是功能接口,因此可以使用具有相同签名(参数和返回类型)的lambda表达式或方法引用替换它.那么它是如何工作的,我们也可以传递compareTo只引用一个参数并且这些方法的签名不匹配?如何在Java8中翻译方法引用?
ArrayListequals从其父类继承实现,AbstractList这不是很有效.
它可以首先检查两个ArrayLists的大小,然后false如果这些大小不同则立即返回.为什么不这样ArrayList做?
我对Scala很新,并尝试理解可变性Seq.因为它在包中mutable我期望有一种方法允许我们在不复制整个集合的情况下追加元素.
但是没有+=方法mutable.Seq,但是在Buffer.:+并+:复制该集合.
那为什么它是可变的?
我有一些java9模块使用的第三方库不是Java9模块,只是一个简单的实用工具jar.
但是,编译器抱怨它无法从我的实用程序中找到包.
我应该怎么做module-info.java才能使用我的第三方库?
假设我有一些lib.jar我没有源代码的库(或者它是用一些不熟悉模块的非Java语言编写的).lib.jar没有module-info.class,我不想将它用作自动模块,所以我想注入module-info.class它.
我首先module-info.java使用以下命令生成:
jdeps --generate-module-info . lib.jar
Run Code Online (Sandbox Code Playgroud)
假设这产生了类似的东西:
module lib {
exports package1;
exports package2;
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试编译它但javac失败因为包package1而且package2不存在:
> javac module-info.java
module-info.java:4: error: package is empty or does not exist: package1
Run Code Online (Sandbox Code Playgroud)
当然,我可以在其中创建目录package1和package2虚拟类,但是有更好的方法吗?
我有一个简单的Java 9 SE项目,其中一个依赖于非模块化项目(在本例中选择了Weld SE),我正在尝试使用Maven(clean install)构建它.为了使Java 9能够启动,我已经添加了module-info.java.最初,此文件仅包含模块名称,并且没有requires公式.
请记住,我唯一的依赖是不是一个模块化的项目,因此,我认为Maven会放在类路径中(不模块路径),因此它会在结束unnamed module中描述的模块化系统的状态.
现在,我的Maven版本是3.3.9,我知道我需要在版本3.6中使用Maven编译器插件,如此处所述当然我已经使用jigsaw下载了JDK 9 EA build并设置了Maven来使用它.
如果我没有构建我的项目module-info.java,一切正常,将东西添加到类路径并构建成功.我想只要你遗漏那个文件,Maven就会坚持旧的方式.
但是,建造它有 module-info.java告诉我,从我的依赖的类不能在类路径中找到.所以我在调试模式下运行Maven(使用-X),确实 - 所有jar都在module-path下,classpath为空.这实际上意味着我的所有依赖项都被转移到自动模块中,我需要声明它们module-info.java.
一旦我声明了自动模块要求(链接到项目的module-info),我就可以在JDK 9上构建它.但它有点混乱 - 我唯一的pom.xml依赖是weld-se-core,但我module-info要求我宣布更多的编译要求通过.
这是一个完整的GitHub项目,可以观察到所有这些.
所以我的问题是:
automatic module并且需要声明它们?automatic module,我可以告诉Maven以某种方式过渡性地允许我的依赖需要引入的任何东西吗?例如Weld的其他部分,CDI API等.requires模块,我不直接使用?例如weld.environment.common如果我从命令行在Java 9上构建JAR,我将一个参数传递--main-class给包含MainClass属性module-info.class:
jar --create --file <filename> --main-class=<mainclass> --module-version 0.1 -C classes .
Run Code Online (Sandbox Code Playgroud)
但是如果我从maven构建一个JAR呢?这是我的maven-jar-plugin配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我可以通过自定义的参数maven-jar-plugin(如compilerArgs为maven-compiler-plugin)?
takeWhile()与Java 9中的filter()有何不同.它有什么额外的实用程序?
Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i < 4 )
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
这可能是以下会做的
Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 4 )
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
那么这个新功能需要什么呢?
在GHC 8中:
{-# LANGUAGE DuplicateRecordFields #-}
data Dog = Dog { name::String }
data Human = Human { name::String }
dog = Dog "Spike"
main = putStrLn $ name dog
Run Code Online (Sandbox Code Playgroud)
此代码无法编译:
Ambiguous occurrence `name'
It could refer to either the field `name', defined at A.hs:4:22
or the field `name', defined at A.hs:3:18
Run Code Online (Sandbox Code Playgroud)
如何正确检索我的狗的名字?
这是模块的模块声明java.rmi:
module java.rmi {
requires java.base;
requires java.logging;
exports java.rmi.activation;
exports com.sun.rmi.rmid to java.base; // <-- cycle
...
}
Run Code Online (Sandbox Code Playgroud)
那么,java.rmi和之间存在循环依赖关系java.base,对吗?平台模块之间是否允许循环?
java ×8
java-9 ×6
java-platform-module-system ×3
maven ×2
arraylist ×1
collections ×1
ghc ×1
haskell ×1
java-8 ×1
java-module ×1
java-stream ×1
modularity ×1
module-info ×1
scala ×1