简体   繁体   English

java 8流-如何在映射后获取原始对象引用

[英]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:而不是Blending1MatrixBlending2Matrix你应该有集合List<BlendingMatrix>SetBlendingMatrix应该有concentrationid然后它看起来像这样:

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.

相关问题 如何在更改原始引用变量后再次引用Java对象 - How to reference a Java object again after changing the original reference variable Java 8个流过滤后得到原始object map - Java 8 Streams get original object after filtering map 有没有办法将流映射过滤器和映射回到Java 8中的原始对象? - Is there any way to Stream Map Filter & Map back to original object in Java 8? Java 8流 - 在flatmap之后引用原始流对象 - Java 8 stream - Referring to original stream object after flatmap Java stream api 在链中使用原始 ZA8CFDE6331BD59EB2AC96F8911C4B66 的参考 - Java stream api using reference of original object within chain 如何获取地图<String, List<Object> &gt; 来自 Java 8 中的流 - How get a Map<String, List<Object>> from a Stream in Java 8 如何使用java流从包含多个不同mysql日期的列表对象中获取地图对象 - How to get a map object, from a list object which contains multiple different mysql dates using java stream 如何在Java8中按流在Map对象上按时间段对对象求和? - How to sum object by time period on a Map object by stream in Java8? Java:包含原始对象引用的对象内部的对象引用 - Java: Object reference inside Object that contains original Object reference 用Java转换对象时,是否保留了对原始对象的引用? - When casting an object in Java, is the reference to the original preserved?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM