lambda 表达式中的错误 return 类型:BigDecimal 无法转换为 long
Bad return type in lambda expression: BigDecimal cannot be converted to long
我试图通过加速在 java 流中编写查询。
当我在 select 中尝试 sum (l_extendedprice * (1 - l_discount))
时,出现此错误:
Bad return type in lambda expression: BigDecimal cannot be converted to long. Operator '-' cannot be applied to 'int', 'java.math.BigDecimal'.
我的代码是这样的:
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()))
));
我该如何解决这个问题?
所以问题是 +
、-
、*
、/
、... 无法与 BigDecimal
一起使用。您必须使用 .add()
、.subtract()
、.multiply()
、.divide()
、……计算方法。
如果可能,您可以使用 BigDecimal.longValue()
or BigDecimal.longValueExact()
将 BigDecimal
转换为长值以在计算中使用它们:
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
编写自己的集合,或者直接计算您需要的值。您可以阅读 this question 使用 Java Stream.
总结 BigDecimal
值
我试图通过加速在 java 流中编写查询。
当我在 select 中尝试 sum (l_extendedprice * (1 - l_discount))
时,出现此错误:
Bad return type in lambda expression: BigDecimal cannot be converted to long. Operator '-' cannot be applied to 'int', 'java.math.BigDecimal'.
我的代码是这样的:
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()))
));
我该如何解决这个问题?
所以问题是 +
、-
、*
、/
、... 无法与 BigDecimal
一起使用。您必须使用 .add()
、.subtract()
、.multiply()
、.divide()
、……计算方法。
如果可能,您可以使用 BigDecimal.longValue()
or BigDecimal.longValueExact()
将 BigDecimal
转换为长值以在计算中使用它们:
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
编写自己的集合,或者直接计算您需要的值。您可以阅读 this question 使用 Java Stream.
BigDecimal
值