[英]java 8 stream - how to get original object reference after map
Is at all possible to simply the below code using Java 8 stream?是否可以使用 Java 8 流简单地编写以下代码?
Code:-代码:-
private double calculateBCMMatrixCostForAnalyte(Long startingMaterialId) {
double bcmMatrixCost = 0;
StartingMaterialMatrix smm = startingMaterialMatrixRepository.findByStartingMaterialId(startingMaterialId);
if (smm.getBlending1MatrixConcentration() != null) {
bcmMatrixCost += (priceService.findNeatMaterialCostByStartingMaterialId(smm.getBlending1Matrix().getId()) * smm.getBlending1MatrixConcentration()) / 1000000f;
}
if (smm.getBlending2MatrixConcentration() != null) {
bcmMatrixCost += (priceService.findNeatMaterialCostByStartingMaterialId(smm.getBlending2Matrix().getId() * smm.getBlending2MatrixConcentration())) / 1000000f;
}
return Precision.round(bcmMatrixCost, 4);
}
I tried something like below我试过类似下面的东西
Stream.of(startingMaterialMatrixRepository.findByStartingMaterialId(startingMaterialId))
.filter(smm -> smm.getBlending1MatrixConcentration() != null)
.mapToDouble(smm -> priceService.findNeatMaterialCostByStartingMaterialId(smm.getStartingMaterial().getId()) * smm.getBlending1MatrixConcentration() / 1000000f);
But after this, I won't have any reference to the original 'smm' object to do further checks.但在此之后,我将不再有任何对原始“smm”对象的引用来进行进一步检查。
I honestly would not be hell-bent on turning this into a stream, it doesn't really need to be.老实说,我不会一心想把它变成一个流,它真的不需要。
If it's overly complex to turn something into a stream, it may not be worth it, is there a specific reason?如果把某个东西变成一个流太复杂了,可能不值得,有什么具体的原因吗?
that being said, you could make two streams, filter one, one way, then filter the other way, then use Stream.concat
to combine the two streams, and call .sum
but I do not think it'd be worth it.话虽如此,您可以创建两个流,以一种方式过滤一个,然后以另一种方式过滤,然后使用
Stream.concat
组合两个流,并调用.sum
但我认为这不值得。
edit:编辑:
You may need DoubleStream.concat
, since you are mapping to double.您可能需要
DoubleStream.concat
,因为您要映射到双DoubleStream.concat
。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/DoubleStream.html#concat-java.util.stream.DoubleStream-java.util.stream.DoubleStream- https://docs.oracle.com/javase/8/docs/api/java/util/stream/DoubleStream.html#concat-java.util.stream.DoubleStream-java.util.stream.DoubleStream-
Usage of Stream would be good if you change your StartingMaterialMatrix
class.如果你改变你的
StartingMaterialMatrix
类,使用 Stream 会很好。 Instead of have Blending1Matrix
and Blending2Matrix
you should have collection List<BlendingMatrix>
or Set
and BlendingMatrix
should have concentration
and id
And then it will looks like this:而不是
Blending1Matrix
和Blending2Matrix
你应该有集合List<BlendingMatrix>
或Set
和BlendingMatrix
应该有concentration
和id
然后它看起来像这样:
smm.getBlendingMatrixes()
.stream()
.filter(blendingMatrix -> blendingMatrix.getConcentration() != null)
.mapToDouble(blendingMatrix -> (priceService.findNeatMaterialCostByStartingMaterialId(blendingMatrix .getId()) * blendingMatrix.getConcentration())) / 1000000f)
.sum();
This is really not readable, but here it is这真的不可读,但在这里
public double streamWay(Long startingMaterialId) {
return Stream.of(startingMaterialMatrixRepository.findByStartingMaterialId(startingMaterialId))
.map(Stream::of)
.flatMapToDouble(smmStream ->
DoubleStream.concat(
smmStream.filter(smm -> smm.getBlending1MatrixConcentration() != null)
.mapToDouble(smm -> priceService.findNeatMaterialCostByStartingMaterialId(smm.getStartingMaterial().getId()) * smm.getBlending1MatrixConcentration() / 1000000f),
smmStream.filter(smm -> smm.getBlending1MatrixConcentration() != null)
.mapToDouble(smm -> priceService.findNeatMaterialCostByStartingMaterialId(smm.getBlending1Matrix().getId() * smm.getBlending2MatrixConcentration()) / 1000000f)
)).sum();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.