Java的包管理系统对我来说似乎总是简单而有效.JDK本身大量使用它.我们一直在使用它来模仿名称空间和模块的概念.
什么是Project Jigsaw(又名Java平台模块系统)试图填写?
来自官方网站:
该项目的目标是为Java SE平台设计和实现标准模块系统,并将该系统应用于平台本身和JDK.
以下代码在Java 8和9中编译,但行为不同.
class Simple {
static String sample = "\nEn un lugar\r\nde la Mancha\nde cuyo nombre\r\nno quiero acordarme";
public static void main(String args[]){
String[] chunks = sample.split("\\R\\R");
for (String chunk: chunks) {
System.out.println("Chunk : "+chunk);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我用Java 8运行它时,它返回:
Chunk :
En un lugar
de la Mancha
de cuyo nombre
no quiero acordarme
Run Code Online (Sandbox Code Playgroud)
但是当我使用Java 9运行它时,输出是不同的:
Chunk :
En un lugar
Chunk : de la Mancha
de cuyo nombre
Chunk : no quiero acordarme
Run Code Online (Sandbox Code Playgroud)
为什么?
我正在创建片段与takeWhile探索其可能性.与flatMap结合使用时,行为与预期不符.请在下面找到代码段.
String[][] strArray = {{"Sample1", "Sample2"}, {"Sample3", "Sample4", "Sample5"}};
Arrays.stream(strArray)
.flatMap(indStream -> Arrays.stream(indStream))
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Run Code Online (Sandbox Code Playgroud)
实际产量:
Sample1
Sample2
Sample3
Sample5
Run Code Online (Sandbox Code Playgroud)
ExpectedOutput:
Sample1
Sample2
Sample3
Run Code Online (Sandbox Code Playgroud)
期望的原因是takeWhile应该执行直到内部条件变为真.我还在flatmap中添加了printout语句以进行调试.流返回两次,符合预期.
但是,如果链中没有flatmap,这样可以正常工作.
String[] strArraySingle = {"Sample3", "Sample4", "Sample5"};
Arrays.stream(strArraySingle)
.takeWhile(ele -> !ele.equalsIgnoreCase("Sample4"))
.forEach(ele -> System.out.println(ele));
Run Code Online (Sandbox Code Playgroud)
实际产量:
Sample3
Run Code Online (Sandbox Code Playgroud)
这里实际输出与预期输出匹配.
免责声明:这些代码段仅用于代码练习,不提供任何有效的用例.
更新:
错误JDK-8193856:修复将作为JDK 10的一部分提供.更改将更正whileOps
Sink :: accept
@Override
public void accept(T t) {
if (take = predicate.test(t)) {
downstream.accept(t);
}
}
Run Code Online (Sandbox Code Playgroud)
改变实施:
@Override
public void accept(T t) {
if (take && …Run Code Online (Sandbox Code Playgroud) 我正在学习Java 8 lambda表达式的过程,并且想问一下peek我遇到的与函数接口中的方法有关的以下Java代码.
在IDE上执行程序时,它不提供输出.我原以为它会给2, 4, 6.
import java.util.Arrays;
import java.util.List;
public class Test_Q3 {
public Test_Q3() {
}
public static void main(String[] args) {
List<Integer> values = Arrays.asList(1, 2, 3);
values.stream()
.map(n -> n * 2)
.peek(System.out::print)
.count();
}
}
Run Code Online (Sandbox Code Playgroud) 每当我运行我的项目JUnit测试(使用JUnit 5与Java 9和Eclipse Oxygen 1.a)我遇到eclipse无法找到任何测试的问题.
在运行配置下,eclipse甚至找不到用@Test注释的方法,而是只显示" (所有方法) ".以下图片有望为我的设置提供更好的一瞥:
java.lang.NoClassDefFoundError: org/junit/platform/launcher/core/LauncherFactory
at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.<init>(JUnit5TestLoader.java:31)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base/java.lang.Class.newInstance(Unknown Source)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createRawTestLoader(RemoteTestRunner.java:368)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.createLoader(RemoteTestRunner.java:363)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.defaultInit(RemoteTestRunner.java:307)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.init(RemoteTestRunner.java:222)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.launcher.core.LauncherFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 11 more
Run Code Online (Sandbox Code Playgroud)
我已经试过了
其中一些步骤可以在这里找到,但最终问题仍然存在.
Java 9 javac有一个新的标志--release:
> javac --help
...
--release <release>
Compile for a specific VM version. Supported targets: 6, 7, 8, 9
Run Code Online (Sandbox Code Playgroud)
它-source与-target旗帜有什么不同?它只是一个捷径-source X -target X吗?
在最近几个主要版本的Java的每次迭代中,似乎都有新的方法来管理并发任务.
在Java 9中,我们有Flow API,类似于RxJava的Flowable API,但Java 9有一组更简单的类和接口.
Java 9
有Flow.Publisher,Flow.Subscriber,Flow.Processor,Flow.Subscription,和SubmissionPublisher,这就是它.
RxJava
拥有全包的流API状类,即io.reactivex.flowables,io.reactivex.subscribers,io.reactivex.processors,io.reactivex.observers,和io.reactivex.observables这似乎做同样的事情.
这两个库之间的主要区别是什么?为什么有人会使用Java 9 Flow库而不是更多样化的RxJava库,反之亦然?
为什么这个代码输出02在java-8中但o2在java-9或更高版本中输出?
"o2".replaceAll("([oO])([^[0-9-]])", "0$2")
Run Code Online (Sandbox Code Playgroud) 在Java 9,新的工厂方法已经出台了List,Set和Map接口.这些方法允许使用一行中的值快速实例化Map对象.现在,如果我们考虑:
Map<Integer, String> map1 = new HashMap<Integer, String>(Map.of(1, "value1", 2, "value2", 3, "value3"));
map1.put(4, null);
Run Code Online (Sandbox Code Playgroud)
如果我们这样做,上面是允许的,没有任何例外:
Map<Integer, String> map2 = Map.of(1, "value1", 2, "value2", 3, "value3", 4, null );
Run Code Online (Sandbox Code Playgroud)
它抛出:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:221)
..
Run Code Online (Sandbox Code Playgroud)
我无法得到,为什么在第二种情况下不允许为空.
我知道HashMap可以将null作为键和值,但为什么在Map.of的情况下受限制?
同样的事情发生在的情况下java.util.Set.of("v1", "v2", null)和java.util.List.of("v1", "v2", null).