我有一台运行Windows XP SP3 32位的虚拟机.在这台机器上,我从这里安装了Java SE JDK 8 build b44 Developer Preview .
我还安装了JavaFX 2.1 SDK.
它工作正常:
java -version
> java version "1.8.0-ea"
> Java(TM) SE Runtime Environment (build 1.8.0-ea-b44)
> Java HotSpot(TM) Client VM (build 24.0-b14, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
我尝试运行以下程序(取自此处):
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleButtonBuilder;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class LambdasWithJavaFx extends Application
{
public static void main(String[] args)
{
Application.launch(args);
} …Run Code Online (Sandbox Code Playgroud) 我正在玩未来的Java 8版本,即JDK 1.8.
我发现你很容易做到
interface Foo { int method(); }
Run Code Online (Sandbox Code Playgroud)
并使用它
Foo foo = () -> 3;
System.out.println("foo.method(); = " + foo.method());
Run Code Online (Sandbox Code Playgroud)
只打印3.
我还发现有一个java.util.function.Function接口以更通用的方式执行此操作.但是这段代码不会编译
Function times3 = (Integer triple) -> 3 * triple;
Integer twelve = times3.map(4);
Run Code Online (Sandbox Code Playgroud)
似乎我首先要做的事情
interface IntIntFunction extends Function<Integer, Integer> {}
IntIntFunction times3 = (Integer triple) -> 3 * triple;
Integer twelve = times3.map(4);
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有另一种方法可以避免IntIntFunction步骤?
为了开发JavaFX应用程序,我使用了eclipse的4.3.1快照和JDK 8 build b116.在我的工作区项目中,构建路径中的JRE库包含始终重置为Java 1.4:

不幸的是,这只能暂时修复(直到下一次eclipse重启):

在我的pom文件的构建部分,我有:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<debug>true</debug>
<debuglevel>source,lines</debuglevel>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
我很欣赏一个不太灵活的解决方案.
[更新]这个问题似乎与当前版本的问题有关
在Java 8中,Class似乎已经获得了获取AnnotatedType其超类及其超接口的视图的方法.
你如何将a转换Class为自己的 AnnotatedType?这个问题甚至有意义吗?
据我所知,a AnnotatedType-a Type,not is-a Type.AnnotatedElement不过,这是一个; 这一切都非常混乱.
到目前为止,我已经搜索过Javadocs无济于事.
我想使用Java 8 的新方法引用在编译时提供一些代码的更多验证.
假设我有一个validateMethod方法需要一个参数:要验证的"方法".例如 :
validateMethod(foo, "methodA");
Run Code Online (Sandbox Code Playgroud)
这里,该方法将在运行时验证foo#methodA()存在.
使用方法引用,我希望能够:
validateMethod(foo::methodA);
Run Code Online (Sandbox Code Playgroud)
因此,该方法的存在将在编译时验证.
问题是似乎必须将方法引用分配给功能接口.例如,这个:
Object dummy = foo::methodA;
Run Code Online (Sandbox Code Playgroud)
生成错误:" 此表达式的目标类型必须是功能接口 ".
如果我创建一个与该methodA方法具有兼容签名的功能接口,它可以工作:
@FunctionalInterface
public interface MyFunctionalInterface
{
public String run();
}
MyFunctionalInterface dummy = foo::methodA;
Run Code Online (Sandbox Code Playgroud)
现在存在的foo#methodA()是在编译时验证的,这就是我想要的!
但...
假设validateMethod不知道它必须验证的方法的签名.那么它仍然可以实现吗?
让我们假装我们不关心歧义和重载方法.在Java 8中是否可以实现某种方法来触发任何方法引用的验证?
例如 :
public class Foo
{
public String methodA()
{
return "methodA";
}
public String methodB(String str)
{
return "methodB";
}
public …Run Code Online (Sandbox Code Playgroud) 我想months使用Arrays.sort方法按长度对数组中的String元素进行排序.我在这里被告知,可以使用lambda表达式而不是创建实现Comparator的新类.是否完全相同,但它不起作用.
import java.util.Arrays;
import java.util.Comparator;
public class MainClass {
public static void main(String[] args)
{
String[] months = {"January","February","March","April","May","June","July","August","September","October","December"};
System.out.println(Arrays.toString(months)); //printing before
//neither this works:
Arrays.sort(months,
(a, b) -> Integer.signum(a.length() - b.length())
);
//nor this:
Arrays.sort(months,
(String a, String b) -> { return Integer.signum(a.length() - b.length()) };
);
System.out.println(Arrays.toString(months)); //printing after
}
}
Run Code Online (Sandbox Code Playgroud) Android Studio和Eclipse都要求我安装JDK 6,即使已经安装了JDK 8.在线的几个变通方法告诉我更改java_home以指向JDK 8安装位置,这样做/ usr/libexec/java_home和java -version命令都引用了JDK 8安装,但Android Studio和Eclipse仍然要求我安装JDK 6任何人都解决了这个问题.
在我看来,这是编译器或JVM中的一个错误,但也许有人有更好的解释.
下面的代码运行正常,但如果我取消注释第二个runnable初始化,直接使用'this',它不能反序列化对象(in.readObject()抛出异常).
public class TestClass implements Serializable {
String msg = "HEY!";
SerializableRunnable runnable;
public TestClass() {
TestClass self = this;
runnable = () -> self.say(); // uses a local copy of 'this'
// runnable = () -> this.say(); // uses 'this' directly
}
public void say() {
System.out.println(msg);
}
public static void main(String[] args) throws Exception {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try (ObjectOutputStream out = new ObjectOutputStream(buffer)) {
out.writeObject(new TestClass());
}
try (ObjectInputStream in …Run Code Online (Sandbox Code Playgroud) 我刚刚下载了最新版本的SonarQube 4.3,然后尝试使用以下命令构建一个java-8项目:
mvn clean install
mvn sonar:sonar
Run Code Online (Sandbox Code Playgroud)
这给了我下面的例外.
谷歌搜索,我得到的印象这是一个应该修复的早期问题......?
http://sonarqube.15.x6.nabble.com/Sonar-analyze-Java-1-8-project-Failure-td5023663.html
http://jira.codehaus.org/browse/SONARJAVA-482
SonarQube 4.3是否支持java-8?
或者任何线索,有什么问题?
-------------------------------------------------------
T E S T S
-------------------------------------------------------
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.RuntimeException: Class java/util/UUID could not be instrumented.
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:138)
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:99)
at org.jacoco.agent.rt.internal_6effb9e.PreMain.createRuntime(PreMain.java:55)
at org.jacoco.agent.rt.internal_6effb9e.PreMain.premain(PreMain.java:47)
... 6 more
Caused by: java.lang.NoSuchFieldException: $jacocoAccess
at java.lang.Class.getField(Class.java:1690)
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:136)
... 9 more
FATAL ERROR in native method: processing of -javaagent failed
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud) 我这里有一个非常简单的程序:
public static void main(String[] args) {
LocalDate year = LocalDate.ofYearDay(2022, 100);
System.out.println(year);
System.out.println(WeekFields.of(Locale.GERMAN).weekOfYear());
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0));
System.out.println(year.with(WeekFields.of(Locale.GERMAN).weekOfYear(), 0).with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)));
}
Run Code Online (Sandbox Code Playgroud)
但是它在JVM 8和JVM 10上的行为有所不同。问题似乎出在的实现上WeekFields.of(Locale.GERMAN).weekOfYear()。
在JVM 10上,我得到以下结果:
JVM 10
2022-04-10
WeekOfYear[WeekFields[SUNDAY,1]]
2021-12-19
2021-12-13
Run Code Online (Sandbox Code Playgroud)
而在JVM 8上:
JVM 8
2022-04-10
WeekOfYear[WeekFields[MONDAY,4]]
2022-01-02
2021-12-27
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?我是否正在做某事,可能会导致不确定的行为?还是在某处指定了这种行为变化?
JVM10:
$ java -version
openjdk version "10.0.2" 2018-07-17
OpenJDK Runtime Environment (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4)
OpenJDK 64-Bit Server VM (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4, mixed mode)
Run Code Online (Sandbox Code Playgroud)
JVM8
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-8u191-b12-2ubuntu0.18.04.1-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, …Run Code Online (Sandbox Code Playgroud)