小编lya*_*ffe的帖子

Java Lambda表达式避免多次迭代

伙计们,

考虑以下示例,给定一个Trade对象列表,我的代码需要返回一个包含交易量24小时,7天,30天和所有时间的数组.

使用普通的旧迭代器,这只需要对集合进行一次迭代.

我正在尝试使用Java 8流和Lambda表达式来做同样的事情.我提出了这个代码,它看起来很优雅,工作正常,但需要在列表上进行4次迭代:

public static final int DAY = 24 * 60 * 60;

public double[] getTradeVolumes(List<Trade> trades, int timeStamp) {
    double volume = trades.stream().mapToDouble(Trade::getVolume).sum();
    double volume30d = trades.stream().filter(trade -> trade.getTimestamp() + 30 * DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
    double volume7d = trades.stream().filter(trade -> trade.getTimestamp() + 7 * DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
    double volume24h = trades.stream().filter(trade -> trade.getTimestamp() + DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
    return new double[]{volume24h, volume7d, volume30d, volume};
}
Run Code Online (Sandbox Code Playgroud)

如何在列表中仅使用一次迭代来实现相同的目标?

java lambda java-8 java-stream

7
推荐指数
2
解决办法
795
查看次数

实际中会出现虚假唤醒

在运行 Java 1.7.0_09 的双四核 Windows 2008 64 位服务器上进行 3000 个并发会话和每秒约 300 个事务的负载测试期间,我们在实践中观察到两个已确认的虚假唤醒实例,即线程在未收到通知的情况下退出其 wait() 方法并且在等待超时到期之前。

在唤醒期间,机器 CPU 利用率低于 20%,并且有足够的内存可用。也没有观察到过多的垃圾收集。幸运的是,我们最近引入的自旋锁能够捕获这种情况并继续 wait()

java.lang.Object wait() 的 JavaDoc 中记录了虚假唤醒现象,但这是我第一次在实践中真正看到它。这是 Windows 中的错误还是 Java 中的错误?

java windows multithreading

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

生成可预测的安全随机数

如何实例化可预测且安全的随机数生成器,该生成器将在 Java 版本和操作系统之间生成一致的随机数?

以下代码曾经适用于 Java 8,但不再适用于 Java 10:

import java.security.SecureRandom;

public class PredictableRandom {

public static void main(String[] args) {
    PredictableRandom predictableRandom = new PredictableRandom();
    predictableRandom.execute();
}

private void execute() {
    SecureRandom secureRandom = new SecureRandom();
    System.out.println(secureRandom.getAlgorithm());
    System.out.println(secureRandom.getProvider());
    long seed = 12345678L;
    secureRandom.setSeed(seed);
    System.out.println(secureRandom.nextLong());
    SecureRandom secureRandom2 = new SecureRandom();
    secureRandom2.setSeed(seed);
    System.out.println(secureRandom2.nextLong());
}
}
Run Code Online (Sandbox Code Playgroud)

在 Java 8 中 - 好的,不同的随机对象生成相同的随机数:

SHA1PRNG
SUN version 1.8
3325995872096263519
3325995872096263519
Run Code Online (Sandbox Code Playgroud)

在 Java 10 中 - 不好,不同的随机对象生成不同的随机数:

DRBG
SUN version 10
-3526685326322256981
-2373261409119309182
Run Code Online (Sandbox Code Playgroud)

java random secure-random

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