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类的博客文章).
有更好的选择吗?谢谢.
我有这个代码动态生成类并加载它
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并且堆仍未使用
图像显示permgen使用超时,最后JVM终止
现在相同的代码针对Java 8(jdk1.8.0_40-ea)运行并且正如预期的那样它继续扩展本机内存(Metaspace)但令人惊讶的是,1g的Metaspace它在OldGen中消耗了3g的堆(随着时间的推移,几乎是Metaspace的3倍)
该图显示了Metaspace使用超时和系统内存使用示例
这封来自Jon Masamitsu的电子邮件和这张JEP门票说
interned
String和Class stats以及一些misc数据已移至Heap
当它将更多类加载到Metaspace中时,究竟是什么导致了堆的增加?
我试图使用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) 我写了一个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) 这与这个问题有关:如何进行功能组合?
我注意到方法引用可以分配给声明为的变量Function,因此我假设它应该具有andThen或compose函数,因此我希望我们可以直接组合它们.但很显然,我们需要把它们分配给声明为可变的Function第一(或类型转换调用之前)之前,我们可以称之为andThen或compose他们.
我怀疑我可能会对这应该如何运作有一些误解.
所以我的问题:
andThen方法之前,为什么我们需要先键入或将其分配给变量?示例代码如下.
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 8为我们提供了许多有趣的方法来使用功能接口,并为它们添加了一个新的注释:@FunctionalInterface.如果我们不遵守功能接口的规则(只需要一个需要覆盖的抽象方法),它的工作就是告诉编译器对我们大喊大叫.
java.util.function包中有43个接口,带有此批注.搜索jdk.1.8.0/src @FunctionalInterface只能获得57次点击.为什么其他可能添加的接口(如AutoCloseable)@FunctionalInterface仍然缺少它?
注释文档中有一些模糊的提示:
"用于指示接口类型声明旨在成为功能接口的信息性注释类型"
有没有什么好的理由不打算我设计的接口(可能只是一个功能接口)不能用作一个接口?除了没有意识到它可能被添加之外,是否有任何迹象?
是不是将抽象方法添加到任何已发布的接口来阻止实现它的任何人,功能与否?我觉得玩世不恭,假设他们只是懒得去追捕他们,但其他解释是什么?
更新:看过"应该'可比'是一个'功能界面'?" 我发现我仍然有唠叨的问题.当单一方法接口和功能接口在结构上相同时,它们会有什么不同?简单的名称是不同的?Comparable和Comparator在语义上足够接近.事实证明它们在结构上是不同的,但仍然不是最好的例子......
是否有一种情况,SMI在结构上很好用作功能接口,但仍然不鼓励接口名称和方法的语义含义?或者也许是Javadocs隐含的合同?
我一直在尝试使用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,但找不到有效转换为毫秒的方法.我并不是说这是最好的方法,如果你知道更好的东西,我会非常感谢一些指示.
我用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表达式实现这个场景?
当我尝试创建项目时,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 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还是其他什么东西?