请提供给我参考,为什么使用Java Stream API的以下两个析因实现之间的执行时间会有显着差异:
我的期望是接近执行时间,但是并行版本的速度提高了2倍。我没有运行任何专门的基准测试,但是即使在冷启动的jvm中,执行时间也不应有太大差异。在下面,我附上两个实现的源代码:
public class FastFactorialSupplier implements FactorialSupplier {
private final ExecutorService executorService;
public FastFactorialSupplier(ExecutorService executorService) {
this.executorService = executorService;
}
@Override
public BigInteger get(long k) {
try {
return executorService
.submit(
() -> LongStream.range(2, k + 1)
.parallel()
.mapToObj(BigInteger::valueOf)
.reduce(BigInteger.ONE, (current, factSoFar) -> factSoFar.multiply(current))
)
.get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return BigInteger.ZERO;
}
}
Run Code Online (Sandbox Code Playgroud)
public class MathUtils {
public static BigInteger factorial(long k) {
return LongStream.range(2, k + 1) …Run Code Online (Sandbox Code Playgroud) 我在使用JUnit进行单元测试时遇到了一些麻烦.
考虑以下代码:
这是我要测试的类中的dependacy注入,我们称之为Controller.
@Inject private FastPowering fastPowering;
Run Code Online (Sandbox Code Playgroud)
这是单元测试:
@RunWith(MockitoJUnitRunner.class)
public class ControllerTest {
@Mock
FastPowering fastPower;
@InjectMocks
Controller controller;
@Test
public void test() {
assertEquals(
(controller.computeAnswer(new BigDecimal(2), 2)).longValue(),
(long) Math.pow(2, 2));
}
}
Run Code Online (Sandbox Code Playgroud)
似乎fastPower为null,请解释如何解决这个问题.空指针异常,因为在.computeAnswer方法中调用了@injected字段(fastPower)
编辑:
解决了我应该读过@Mock和@Spy之间的区别......