标签: java-8

Lambda表达式在Java 8中不起作用?

我有一台运行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 lambda java-8 javafx-2

15
推荐指数
1
解决办法
2万
查看次数

Java 8中的Lambdas和泛型

我正在玩未来的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步骤?

java lambda java-8

15
推荐指数
1
解决办法
4793
查看次数

Eclipse:Java Build Path重置中的JRE系统库

为了开发JavaFX应用程序,我使用了eclipse4.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(1.8.0-ea-b121),
  • Maven(3.1.1/1.5.0.20131218-0705),
  • m2e(1.5.0.20131218-1208)连同
  • JDT beta补丁[ 更新站点 ].

java eclipse buildpath maven java-8

15
推荐指数
1
解决办法
5万
查看次数

Java 8:Class to AnnotatedType

在Java 8中,Class似乎已经获得了获取AnnotatedType其超类及其超接口的视图的方法.

你如何将a转换Class自己的 AnnotatedType?这个问题甚至有意义吗?

据我所知,a AnnotatedType-a Type,not is-a Type.AnnotatedElement不过,这是一个; 这一切都非常混乱.

到目前为止,我已经搜索过Javadocs无济于事.

java java-8

15
推荐指数
1
解决办法
2013
查看次数

Java 8方法引用:在编译时验证方法

我想使用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)

java java-8

15
推荐指数
1
解决办法
2226
查看次数

java:带有lambda表达式的Arrays.sort()

我想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)

java arrays sorting lambda java-8

15
推荐指数
1
解决办法
5万
查看次数

在Mac OSX上使用Android Studio和Eclipse使用JDK 7或更高版本

Android Studio和Eclipse都要求我安装JDK 6,即使已经安装了JDK 8.在线的几个变通方法告诉我更改java_home以指向JDK 8安装位置,这样做/ usr/libexec/java_home和java -version命令都引用了JDK 8安装,但Android Studio和Eclipse仍然要求我安装JDK 6任何人都解决了这个问题.

java eclipse java-8 android-studio osx-mavericks

15
推荐指数
1
解决办法
2万
查看次数

访问实例字段和方法的Java 8 lambda无法反序列化

在我看来,这是编译器或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)

java lambda serialization deserialization java-8

15
推荐指数
1
解决办法
2244
查看次数

Java8项目的SonarQube提供了jacoco-Exception

我刚刚下载了最新版本的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)

java java-8 jacoco sonarqube

15
推荐指数
2
解决办法
8551
查看次数

WeekField在JVM 8和JVM 10上的不同行为

我这里有一个非常简单的程序:

 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)

java jvm java-8 java-10 localdate

15
推荐指数
2
解决办法
276
查看次数