标签: java-8

使用JPA2/Hibernate保留java.time.Instant(JDK8)

JPA和Hibernate目前都不支持JSR-310在JDK8中带来的新日期/时间类(JPA 票证,Hibernate 票证).尽管如此,我想用JDK8日期/时间类进行编码,因为它们最终设计得很好.特别是,我感兴趣java.time.Instant,并不是完全支持所有java.time.*类型,因为我的所有实体都将使用这个特定的类(或者我现在想,至少:-)

一种选择是编写类型转换器,如JPA 2.1所定义.但是,我们的应用服务器是JBoss EAP 6.3,它是JPA 2.0但不兼容2.1,所以现在这是不可能的.

下一个选项是使用Hibernate用户类型(关于在此处转换其他JSR-310类的博客文章).

有更好的选择吗?谢谢.

hibernate jpa jpa-2.0 java-8 java-time

16
推荐指数
3
解决办法
1万
查看次数

Java8元空间和堆使用

我有这个代码动态生成类并加载它

import javassist.CannotCompileException;
import javassist.ClassPool;

public class PermGenLeak {
    private static final String PACKAGE_NAME = "com.jigarjoshi.permgenleak.";

    public static void main(String[] args) throws CannotCompileException, InterruptedException {
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            ClassPool pool = ClassPool.getDefault();
            pool.makeClass(PACKAGE_NAME + i).toClass();
            Thread.sleep(3);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我针对Java 7(jdk1.7.0_60)启动了这个类,正如预期的那样,它填满了PermGenSpace并且堆仍未使用 Java 7内存使用情况 图像显示permgen使用超时,最后JVM终止

现在相同的代码针对Java 8(jdk1.8.0_40-ea)运行并且正如预期的那样它继续扩展本机内存(Metaspace)但令人惊讶的是,1g的Metaspace它在OldGen中消耗了3g的堆(随着时间的推移,几乎是Metaspace的3倍)

Java8内存使用情况 该图显示了Metaspace使用超时和系统内存使用示例

这封来自Jon Masamitsu的电子邮件这张JEP门票

interned String和Class stats以及一些misc数据已移至Heap

当它将更多类加载到Metaspace中时,究竟是什么导致了堆的增加?

java jvm jvm-hotspot java-8 metaspace

16
推荐指数
1
解决办法
7034
查看次数

JDK 8 - "类型java.util.Map $ Entry无法解析"

我试图使用HashMap但得到错误:

"java.util.Map $ Entry类型无法解析.它是从所需的.class文件间接引用的"

我正在使用JDK 8和Eclipse.

谁知道为什么?

我的代码

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Map;
import java.util.HashMap;

public class Analyser {

    public void analyse() throws FileNotFoundException {

        HashMap<String, Integer> candyMap = new HashMap<String, Integer>();

        BufferedReader br = new BufferedReader(new FileReader("Candy.txt"));

        for(String s=br.readLine(); s!=null; s=br.readLine()) {
            System.out.println(s);
        }       

    }
}
Run Code Online (Sandbox Code Playgroud)

java eclipse migration hashmap java-8

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

使用Lambdas时,Maven插件构建失败

我写了一个maven插件/ mojo来生成一些代码.该插件运行良好,并使用Java JDK 1.8构建.

我看到了一些奇怪的行为:它构建,安装等等,如果我使用1.8之前的语法,但是只要我使用Java 8 Lambda表达式,我在执行时会收到以下错误mvn clean install:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor (default-descriptor) on project my-maven-plugin: Execution default-descriptor of goal org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor failed: 13557 -> [Help 1]
Run Code Online (Sandbox Code Playgroud)

这是我的pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.my.group.id</groupId>
    <artifactId>my-maven-plugin</artifactId>
    <packaging>maven-plugin</packaging>
    <version>1.0-SNAPSHOT</version>

    <name>My Maven Mojo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <org.springframework.version>4.0.1.RELEASE</org.springframework.version>
        <joda-time.version>2.3</joda-time.version>
    </properties>

    <dependencies>
       <!-- several dependencies -->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- The following manual call to the maven-plugin plugin is necessary to get …
Run Code Online (Sandbox Code Playgroud)

java lambda maven-plugin maven java-8

16
推荐指数
2
解决办法
3963
查看次数

方法参考的组成

这与这个问题有关:如何进行功能组合?

我注意到方法引用可以分配给声明为的变量Function,因此我假设它应该具有andThencompose函数,因此我希望我们可以直接组合它们.但很显然,我们需要把它们分配给声明为可变的Function第一(或类型转换调用之前)之前,我们可以称之为andThencompose他们.

我怀疑我可能会对这应该如何运作有一些误解.

所以我的问题:

  1. 在调用andThen方法之前,为什么我们需要先键入或将其分配给变量?
  2. 以这种方式需要完成的方法引用的类型究竟是什么?

示例代码如下.

public class MyMethods{
    public static Integer triple(Integer a){return 3*a;}
    public static Integer quadruple(Integer a){return 4*a;}

    public int operate(int num, Function<Integer, Integer> f){
        return f.apply(num);
    }

    public static void main(String[] args){
        MyMethods methods = new MyMethods();
        int three = methods.operate(1, MyMethods::triple); // This is fine
        // Error below
        // int twelve = methods.operate(1, (MyMethods::triple).andThen(MyMethods::quadruple));
        // But this one is …
Run Code Online (Sandbox Code Playgroud)

java eclipse function-composition java-8 method-reference

16
推荐指数
2
解决办法
4009
查看次数

为什么@FunctionalInterface不能在JDK中符合条件的所有接口上使用?

Java 8为我们提供了许多有趣的方法来使用功能接口,并为它们添加了一个新的注释:@FunctionalInterface.如果我们不遵守功能接口的规则(只需要一个需要覆盖的抽象方法),它的工作就是告诉编译器对我们大喊大叫.

java.util.function包中43个接口,带有此批注.搜索jdk.1.8.0/src @FunctionalInterface只能获得57次点击.为什么其他可能添加的接口(如AutoCloseable)@FunctionalInterface仍然缺少它?

注释文档中有一些模糊的提示:

"用于指示接口类型声明旨在成为功能接口的信息性注释类型"

有没有什么好的理由不打算我设计的接口(可能只是一个功能接口)不能用作一个接口?除了没有意识到它可能被添加之外,是否有任何迹象?

是不是将抽象方法添加到任何已发布的接口来阻止实现它的任何人,功能与否?我觉得玩世不恭,假设他们只是懒得去追捕他们,但其他解释是什么?

更新:看过"应该'可比'是一个'功能界面'?" 我发现我仍然有唠叨的问题.当单一方法接口和功能接口在结构上相同时,它们会有什么不同?简单的名称是不同的?Comparable和Comparator在语义上足够接近.事实证明它们在结构上是不同的,但仍然不是最好的例子......

是否有一种情况,SMI在结构上很好用作功能接口,但仍然不鼓励接口名称和方法的语义含义?或者也许是Javadocs隐含的合同?

java functional-programming java-8 functional-interface

16
推荐指数
1
解决办法
2574
查看次数

在java.time中正确地将时间转换为毫秒(Java 8)

我一直在尝试使用Java 8中内置的java.time包将"DateTime"转换为毫秒.

但我无法正确地做到这一点.我想将"29/Jan/2015:18:00:00"转换为毫秒.以下是我尝试过的

Instant instant = Instant.parse("2015-01-29T18:00:00.0z");
Long instantMilliSeconds = Long.parseLong(instant.getEpochSecond() + "" + instant.get(ChronoField.MILLI_OF_SECOND));
System.out.println(new Date(instantMilliSeconds)); // prints Sun Jun 14 05:06:00 PDT 1970
Run Code Online (Sandbox Code Playgroud)

我尝试过使用LocalDateTime,但找不到有效转换为毫秒的方法.我并不是说这是最好的方法,如果你知道更好的东西,我会非常感谢一些指示.

java date java-8 java-time

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

lambda可以访问其目标功能接口的成员吗?

我用java8创建了一个简单的接口.因为它包含一个方法和一个默认方法.

interface Lambda{

default void dummy(){
    System.out.println("Call this..");
}

void yummy();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用历史方式这两种方法

public class DefaultCheck {

public static void main(String[] args) {

    DefaultCheck check = new DefaultCheck();
    check.activate(new Lambda() {

        @Override
        public void yummy() {
            dummy();
        }
    });

}

void activate(Lambda lambda){
    lambda.yummy();
}
Run Code Online (Sandbox Code Playgroud)

}

现在我正在尝试使用lambda表达式实现相同的东西,得到像"dummy is undefined"这样的错误

check.activate(() -> {
        dummy();
    });
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议,如何使用Lambda表达式实现这个场景?

java lambda java-8

16
推荐指数
2
解决办法
1426
查看次数

'jvm-1.8'不是'-target'的有效选择

当我尝试创建项目时,IntelliJ会抱怨以下异常.

Error:scalac: 'jvm-1.8' is not a valid choice for '-target'
Error:scalac: bad option: '-target:jvm-1.8'
Run Code Online (Sandbox Code Playgroud)

但是'gradlew clean install'工作得很好.

项目设置是:

gradle版本2.3

scala 2.10和java

4个模块中的3个使用java 1.7(源和目标兼容性),第4个模块具有源和目标兼容性1.8并导致问题.

我有什么想法可以避免这个错误吗?(迁移到java 7不是一个选项,升级scala是)

java scala intellij-idea gradle java-8

16
推荐指数
4
解决办法
1万
查看次数

Java 8链式方法参考?

假设有一个典型的Java Bean:

class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在BiConsumer的帮助下创建一种更抽象的方式来调用setter:

Map<SomeEnum, BiConsumer<MyBean, String>> map = ...
map.put(SomeEnum.A, MyBean::setA);
map.put(SomeEnum.B, MyBean::setB);
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id));
Run Code Online (Sandbox Code Playgroud)

有没有一种方法,以取代拉姆达(myBean, id) -> myBean.getList().add(id)与链接的方法引用,类似(myBean.getList())::add或者myBean::getList::add还是其他什么东西?

java lambda java-8 method-reference

16
推荐指数
1
解决办法
7908
查看次数