标签: java-8

为什么Drools不能使用Java 8?

我刚刚安装了Java 8的最终版本.当我尝试使用Maven构建我的项目时,如果我使用Java 8,许多测试都会失败,但是使用Java 7会很好.我尝试通过命令行运行它,并将JAVA_HOME设置为C:\ Program Files\Java\jdk1.8.0并通过Eclipse选择jdk1.8.0作为已安装JRE中的默认JRE.两者都失败了 请注意,失败的测试都使用Drools 6(及其依赖项).

这是输出:

-------------------------------------------------------------------------------
Test set: com.local.lds.rules.LocmChiTest
-------------------------------------------------------------------------------
Tests run: 3, Failures: 0, Errors: 3, Skipped: 0, Time elapsed: 1.245 sec <<< FAILURE!
test(com.local.lds.rules.LocmChiTest)  Time elapsed: 0.001 sec  <<< ERROR!
java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:187)
    at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at mockit.internal.util.MethodReflection.invoke(MethodReflection.java:63)
    at mockit.Invocation.proceed(Invocation.java:192)
    at mockit.integration.junit4.internal.BlockJUnit4ClassRunnerDecorator.createTest(BlockJUnit4ClassRunnerDecorator.java:59)
    at sun.reflect.GeneratedMethodAccessor7.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at mockit.internal.util.MethodReflection.invokeWithCheckedThrows(MethodReflection.java:95)
    at mockit.internal.mockups.MockMethodBridge.callMock(MockMethodBridge.java:75)
    at mockit.internal.mockups.MockMethodBridge.invoke(MockMethodBridge.java:41)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java)
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:236)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) …
Run Code Online (Sandbox Code Playgroud)

drools surefire maven java-8

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

Java Stream API:为什么区分顺序和并行执行模式?

来自Stream javadoc:

流管道可以顺序执行或并行执行.此执行模式是流的属性.通过初始选择的顺序或并行执行来创建流.

我的假设:

  1. 顺序/并行流之间没有功能差异.输出永远不会受执行模式的影响.
  2. 由于性能的提高,在给定适当数量的内核和问题大小以证明开销合理的情况下,并行流总是更可取的.
  3. 我们想编写一次代码并在任何地方运行而不必关心硬件(毕竟这是Java).

假设这些假设是有效的(对于一些元假设没有错误),在api中暴露执行模式的价值是什么?

看起来您应该只能声明一个Stream,并且顺序/并行执行的选择应该在下面的层中自动处理,可以通过库代码或JVM本身作为运行时可用核心的函数来处理,大小问题等

当然,假设并行流也可以在单个核心机器上运行,也许只是总是使用并行流来实现这一点.但这真的很难看 - 为什么我的代码中的并行流显式引用它是默认选项?

即使存在您故意想要对顺序流进行硬编码的情况 - 为什么不仅仅是SequentialStream为此目的的子接口,而不是Stream使用执行模式切换进行污染?

java parallel-processing java-8 java-stream

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

为什么Java 8中的功能接口有一个抽象方法?

正如我们在Java 8中所知,引入了功能接口的概念.功能接口有一种abstract方法,可以使用多种默认或静态方法.

但为什么Functional接口只有一个抽象方法呢?如果Interface有多个抽象方法,为什么这不是一个功能接口?

java java-8 functional-interface

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

java8:处理默认方法

在编写加密实用程序类时,我遇到了以下方法的问题:

public static void destroy(Key key) throws DestroyFailedException {
    if(Destroyable.class.isInstance(key)) {
        ((Destroyable)key).destroy();
    }
}

@Test
public void destroySecretKeySpec() {
    byte[] rawKey = new byte[32];
    new SecureRandom().nextBytes(rawKey);
    try {
        destroy(new SecretKeySpec(rawKey , "AES"));
    } catch(DestroyFailedException e) {
        Assert.fail();
    }
}
Run Code Online (Sandbox Code Playgroud)

javax.crypto.spec.SecretKeySpec上述方法的特定情况下可以正常工作,java7因为SecretKeySpec(javadocs 7)没有实现Destroyable(javadocs 7)

现在使用java8SecretKeySpec(javadocs 8)已经被Destroyable(javadocs 8)和方法Destroyable#destroy现在default哪个很好,根据这个声明

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性.

然后代码编译没有任何问题,尽管类ScretKeySpec本身没有被更改,单独的接口SecretKey已经.

问题是oracle's jdk8destroy方法有以下实现:

public …
Run Code Online (Sandbox Code Playgroud)

java secret-key java-8 default-method

18
推荐指数
2
解决办法
791
查看次数

Java 8 mapToInt(mapToInt(e - > e))如何提高性能?

我正在阅读"Java 8 Lambdas"这本书,并且在某些时候作者说:"由于性能优势,尽可能使用原始专用函数是个好主意."

他在这里指的是mapToInt,mapToLong等.

事情是我不知道性能来自哪里说实话.

我们来看一个例子:

    // Consider this a very very long list, with a lot of elements
    List<Integer> list = Arrays.asList(1, 2, 3, 4);

    //sum it, flavour 1
    int sum1 = list.stream().reduce(0, (acc, e) -> acc + e).intValue();

    //sum it, flavour 2
    int sum2 = list.stream().mapToInt(e -> e).sum();

    System.out.println(sum1 + " " + sum2);
Run Code Online (Sandbox Code Playgroud)

因此,在第一种情况下,我使用reduce来对值进行求和,因此BinaryOperator函数将始终接收int(acc)和Integer(集合的当前元素),然后将对整数进行取消装箱int(acc + e)

在第二种情况下,我使用mapToInt,它将每个Integer解包成一个int,然后对它求和.

我的问题是,第二种方法有什么优势吗?当我可以使用地图时,对于int的地图有什么意义呢?

所以是的,这只是糖语法还是有一些性能优势?如果有,请提供一些信息

问候,

java lambda java-8 java-stream

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

Java 8 UTF-8编码问题(java bug?)

使用UTF-8编码创建String时存在不一致.

运行此代码:

public static void encodingIssue() throws IOException {
    byte[] array = new byte[3];
    array[0] = (byte) -19;
    array[1] = (byte) -69;
    array[2] = (byte) -100;

    String str = new String(array, "UTF-8");
    for (char c : str.toCharArray()) {
        System.out.println((int) c);
    }
}
Run Code Online (Sandbox Code Playgroud)

在Java 1.8.0_20(及更早版本)上,我们得到了结果

 65533
Run Code Online (Sandbox Code Playgroud)

在Java 1.7和1.6上,我们得到了正确的结果:

 57052
Run Code Online (Sandbox Code Playgroud)

你遇到过这个错误吗?这有解决方法吗?

这种不一致也表现为Shift_JIS,JIS_X0212-1990,x-IBM300,x-IBM834,x-IBM942,x-IBM942C,x-JIS0208,但显然UTF-8更为紧迫.

java encoding utf-8 java-8

18
推荐指数
2
解决办法
4699
查看次数

解析和翻译Java 8 lambda表达式

在C#中,您可以将lambda表达式包含在表达式树对象中,然后可以解析它.我想知道这在Java中是否也可行?

我正在寻找的是做这样的事情:

BooksRepository.getAll()
.where(b -> b.getIban() == "SomeIban")
.and(b -> b.getAuthor() == "SomeAuthor"); //etc.
Run Code Online (Sandbox Code Playgroud)

然后BooksRepository应该以某种方式将该查询转换为基于指定为lambdas的谓词的以下RESTful API请求:

GET http://mylibrary.com/books?Iban=SomeIban&Author=SomeAuthor
Run Code Online (Sandbox Code Playgroud)

然后将结果返回给客户端.如果在Java中甚至可以实现这一点?

c# java lambda expression-trees java-8

18
推荐指数
2
解决办法
2402
查看次数

Java 8 LocalDateTime和Hibernate 4

我有以下类描述片段:

... 
@Column(name = "invalidate_token_date")
@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime invalidateTokenDate;
....
Run Code Online (Sandbox Code Playgroud)

此代码不起作用,因为@Temporal不支持LocalDateTime.我看到的建议如何使用LocalDateTime乔达时间,但我使用Java 8.

请给我一些建议.


PS
这是我目前的JPA依赖:

<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

hibernate date java-8

18
推荐指数
4
解决办法
2万
查看次数

没有--min-sdk-version> = 24时使用的默认或静态接口方法

为什么我们在Android Studio 3.0 RC1中出现此错误?

 com.android.dx.cf.code.SimException: 
default or static interface method used without --min-sdk-version >= 24
Run Code Online (Sandbox Code Playgroud)

根据android文档,"默认和静态接口方法"功能与任何 min-sdk版本兼容.

我将其跟踪到一个调用Comparator.naturalOrder()的java库- 它已经在API级别24中添加了.
所以我不希望在java库中对此代码有任何错误消息.

当我在我自己的android-app或lib java代码中使用代码时,我看到正确的lint消息:"Call需要API级别24"

错误消息是错误的还是我错过了什么?

android java-8

18
推荐指数
1
解决办法
6299
查看次数

keytool 错误:java.io.IOException:parseAlgParameters 失败:ObjectIdentifier() -- 数据不是对象 ID(标签 = 48)

我正在尝试使用 keytool 生成密钥库并出现以下错误 -

D:\Java\bin>keytool -importkeystore -srckeystore cert1.p12 -srcstoretype pkcs12 -destkeystore cert1.keystore -deststoretype JKS
Enter destination keystore password:
Re-enter new password:
Enter source keystore password:
keytool error: java.io.IOException: parseAlgParameters failed: ObjectIdentifier() -- data isn't an object ID (tag = 48)
Run Code Online (Sandbox Code Playgroud)

windows openssl keytool ssl-certificate java-8

18
推荐指数
2
解决办法
3万
查看次数