Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有更好的方法来使用流重构这段代码_Java_Java Stream - Fatal编程技术网

Java 有没有更好的方法来使用流重构这段代码

Java 有没有更好的方法来使用流重构这段代码,java,java-stream,Java,Java Stream,我正在计算3个值,它们是列表对象的总和。为了得到这些,我写了3条语句,每条语句计算3个值。我想知道有没有什么方法可以用一个流(功能块)之类的东西做得更好 尝试使用3个状态来计算来自相同列表或流的每个总数 BigDecimal totalMkt = subAccounts.parallelStream() .flatMap(ts -> ts.getAssets().parallelStream()) .filter(ast -> !ast.getAsse

我正在计算3个值,它们是列表对象的总和。为了得到这些,我写了3条语句,每条语句计算3个值。我想知道有没有什么方法可以用一个流(功能块)之类的东西做得更好

尝试使用3个状态来计算来自相同列表或流的每个总数

BigDecimal totalMkt = subAccounts.parallelStream()
        .flatMap(ts -> ts.getAssets().parallelStream())
        .filter(ast -> !ast.getAssetTypeCode().equals(AssetType.CURRENCY))
         .map(ast -> ast.getPostMktVal())
        .reduce(BigDecimal::add).orElse(BigDecimal.ZERO);

BigDecimal totalTradeVal = subAccounts.parallelStream()
        .flatMap(ts -> ts.getAssets().parallelStream())
        .filter(ast -> !ast.getAssetTypeCode().equals(AssetType.CURRENCY))
        .map(ast -> ast.getTradeVal())
        .reduce(BigDecimal::add).orElse(BigDecimal.ZERO);

BigDecimal totalValue = totalMkt.add(totalTradeVal).add(totalWrk);

logger.debug("totalMkt "+totalMkt+ 
            " totalTradeVal "+totalTradeVal +
            " totalWrk "+totalWrk +
            " totalValue "+totalValue);

subAccounts.stream()
        .flatMap(subAccount -> subAccount.getAssets().stream()
            .filter(asset->!asset.getAssetTypeCode().equals(AssetType.CURRENCY)))
        .forEach(asset -> {
            logger.debug("assetCode "+asset.getAssetCode());
            BigDecimal weightPct = asset.getPostMktVal()
                .multiply(new BigDecimal(100))
                .divide(totalValue, 5,RoundingMode.HALF_UP);
            asset.setWeightPct(weightPct);
            logger.debug(" weightPct " + weightPct);
        });
@Tarlog建议的新创建的Pair类。当收到多个请求时,这是否有任何影响或问题

    static class Pair<L,R> {
          final L left;
          final R right;

          public L getLeft() {
            return left;
        }

        public R getRight() {
            return right;
        }

        public Pair(L left, R right) {
            this.left = left;
            this.right = right;
          }

          static <L,R> Pair<L,R> of(L left, R right){
              return new Pair<L,R>(left, right);
          }
    }
静态类对{
最后的L左;
最终权利;
公共L getLeft(){
左转;
}
公共权利{
返还权;
}
公共对(左左,右){
this.left=左;
这个。右=右;
}
静态对(左左,右){
返回新的一对(左、右);
}
}

您可以将前两条语句合并为一条:

Pair<BigDecimal, BigDecimal> totalMktTrade = subAccounts.parallelStream()
        .flatMap(ts -> ts.getAssets().parallelStream())
        .filter(ast -> !ast.getAssetTypeCode().equals(AssetType.CURRENCY))
         .map(ast -> Pair.of(ast.getPostMktVal(), ast.getTradeVal()))
        .reduce((a,b) -> Pair.of(a.getLeft().add(b.getLeft(), a.getRight().add(b.getRight());
BigDecimal totalMkt = totalMktTrade.getLeft();
BigDecimal totalTradeVal = totalMktTrade.getRight();
Pair totalMktTrade=subAccounts.parallelStream()
.flatMap(ts->ts.getAssets().parallelStream())
.filter(ast->!ast.getAssetTypeCode().equals(AssetType.CURRENCY))
.map(ast->Pair.of(ast.getPostMktVal(),ast.getTradeVal())
.reduce((a,b)->Pair.of(a.getLeft().add(b.getLeft(),a.getRight().add(b.getRight());
BigDecimal totalMkt=totalMktTrade.getLeft();
BigDecimal totalTradeVal=totalMktTrade.getRight();

我看不出如何组合第三个流,因为它使用了以前的计算结果,包括来自外部的
totalWrk

您可以将前两个语句组合成一个:

Pair<BigDecimal, BigDecimal> totalMktTrade = subAccounts.parallelStream()
        .flatMap(ts -> ts.getAssets().parallelStream())
        .filter(ast -> !ast.getAssetTypeCode().equals(AssetType.CURRENCY))
         .map(ast -> Pair.of(ast.getPostMktVal(), ast.getTradeVal()))
        .reduce((a,b) -> Pair.of(a.getLeft().add(b.getLeft(), a.getRight().add(b.getRight());
BigDecimal totalMkt = totalMktTrade.getLeft();
BigDecimal totalTradeVal = totalMktTrade.getRight();
Pair totalMktTrade=subAccounts.parallelStream()
.flatMap(ts->ts.getAssets().parallelStream())
.filter(ast->!ast.getAssetTypeCode().equals(AssetType.CURRENCY))
.map(ast->Pair.of(ast.getPostMktVal(),ast.getTradeVal())
.reduce((a,b)->Pair.of(a.getLeft().add(b.getLeft(),a.getRight().add(b.getRight());
BigDecimal totalMkt=totalMktTrade.getLeft();
BigDecimal totalTradeVal=totalMktTrade.getRight();

我看不出如何组合第三个流,因为它使用了以前的计算结果,包括来自外部的
totalWrk

创建一个单独的方法并传递必要的参数这可能属于它。值得一提的是,我将更改两件事:使用参数化日志语句,因此年龄不必每次都构建;并且创建一个
BigDecimal onecenter=BigDecimal.valueOf(100);
这样就不会为每次迭代创建(那么多)新的BigDecimal对象。(或者,使用
movePointRight(2)
而不是乘法。)创建一个单独的方法并传递必要的参数这可能属于它。值得一提的是,我将更改两件事:使用参数化日志语句,这样就不必每次都生成消息;创建一个
BigDecimal onecent=BigDecimal.valueOf(100);
这样就不会创建(那么多)为每次迭代创建新的BigDecimal对象。(或者,使用
movePointRight(2)
而不是乘法。)这一对来自apache的commons Language的java 8吗?我可以使用map.entry而不是Pair吗?我想你可以。但我从来没有这样做过,因为条目属于map,它会让人困惑。你也可以创建自己的类。创建自己的内部类作为Pair,内部使用静态方法。只需考虑multiple是否会有任何问题e对同一方法/控制器的请求是来自apache的commons Langler的java 8的这对吗?我可以使用map.entry而不是Pair吗?我想你可以。但我从来没有这样做过,因为条目属于map,它会让人困惑。你也可以创建自己的类。创建自己的内部类作为Pair,内部带有静态方法。想想whet如果对同一方法/控制器有多个请求,则会出现任何问题