当前位置: 首页 > 知识库问答 >
问题:

lambda表达式中的错误返回类型:BigDecimal不能转换为long

彭弘方
2023-03-14

我试图通过加速,用java流编写一个查询。当我尝试在select中求和(l_extendedprice*(1-l_折扣))时,我得到以下错误:

lambda表达式中的错误返回类型:BigDecimal不能转换为long。运算符-不能应用于int、BigDecimaljava.math.。

我的代码是这样的:

JoinComponent joinComponent = app.getOrThrow(JoinComponent.class);
Join<Tuple6<Customer, Orders, Lineitem, Supplier, Nation, Region>> join = joinComponent
        .from(CustomerManager.IDENTIFIER)
        .innerJoinOn(Orders.O_CUSTKEY).equal(Customer.C_CUSTKEY)
        .where(Orders.O_ORDERDATE.greaterOrEqual(sqlDate))
        .where(Orders.O_ORDERDATE.lessThan(sqlDate2))
        .innerJoinOn(Lineitem.L_ORDERKEY).equal(Orders.O_ORDERDATE)
        .innerJoinOn(Supplier.S_SUPPKEY ).equal(Customer.C_NATIONKEY)
        .innerJoinOn(Nation.N_NATIONKEY).equal(Supplier.S_NATIONKEY)
        .innerJoinOn(Region.R_REGIONKEY).equal(Nation.N_REGIONKEY)
        .where(Region.R_NAME.equal("ASIA"))
        .build(Tuples::of);

Comparator<Tuple1<String>> comparator = Comparator
        .comparing((Function<Tuple1<String>, String>) Tuple1::get0)
        .thenComparing(Tuple1::get0);

Map<Tuple1<String>, LongSummaryStatistics> grouped = join.stream()
        .collect(groupingBy(t -> Tuples.of(t.get4().getNName()),
                () -> new TreeMap<>(comparator),
                summarizingLong(t->t.get2().getLDiscount()*(1-t.get2().getLDiscount()))
        ));

我该如何解决这个问题?

共有1个答案

卜泓
2023-03-14

所以问题是-*/,...不适用于BigDecimal。你必须使用. add(). subtra(). Multiply().分开(),...方法进行计算。

如果可能,可以使用BigDecimal。longValue()BigDecimal。longValueExact()要将BigDecimals转换为长值,以便在计算中使用它们,请执行以下操作:

Map<Tuple1<String>, LongSummaryStatistics> grouped = join.stream()
        .collect(Collectors.groupingBy(Tuples::of,
                () -> new TreeMap<>(comparator),
                Collectors.summarizingLong(t -> t.get2().getLDiscount().longValue() *
                        (1 - t.get2().getLDiscount().longValue()))
        ));

或者,您可以使用BigDecimal完成整个计算,并在最后将值转换为long:

Map<Tuple1<String>, LongSummaryStatistics> grouped = join.stream()
        .collect(Collectors.groupingBy(Tuples::of,
                () -> new TreeMap<>(comparator),
                Collectors.summarizingLong(t -> t.get2().getLDiscount()
                        .multiply(BigDecimal.ONE
                        .subtract(t.get2().getLDiscount())).longValue())
        ));

如果两种解决方案都不适用于您,您必须为BigDecimalSummaryStatistics编写自己的集合,或者直接计算所需的值。您可以阅读这个问题来总结使用Java流的BigDecimal值。

 类似资料: