我试图通过加速,用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()))
));
我该如何解决这个问题?
所以问题是,
-
,*
,/
,...不适用于BigDecimal
。你必须使用. add()
,. subtra()
,. Multiply()
,.分开()
,...方法进行计算。
如果可能,可以使用BigDecimal。longValue()
或BigDecimal。longValueExact()
要将BigDecimal
s转换为长值,以便在计算中使用它们,请执行以下操作:
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
值。
我有以下接口和类: 抽象规则类包含一组标准。我想通过评估每个标准来评估规则。我在标题中提到的c1.evaluate().和(c2.evaluate())上有编译错误。 我应该如何解决这个问题? 谢谢。
将异常获取为 :lambda表达式中的返回类型错误:
以下代码在IntelliJ和Eclipse中编译得很好,但JDK编译器1.8.0\u 25对此表示不满。首先,代码。 javac 1.8.0\u 25的输出为: 当我更换时?超级E只需使用E,JDK就能成功编译。 当我将替换为,JDK编译成功。 由于它适用于JDK 1.8.0_60,我怀疑它是编译器错误。 有没有详细说明是什么原因造成的以及何时修复的?
为什么会发生异常'lambda表达式中的ad返回类型:AuthenticatedUser无法转换为User'?如果可选为空,我只想返回此AuthenticatedUser。
我需要通过触摸按钮来更改形状类型。我尝试了这种方法,但我得到了一个错误,即形状类型不能转换为布尔值。代码: 错误:
如果会发生重复,我需要确认数据。但不能这样做。 在这种情况下,是否可以将字符串转换为对象,或通过另一个表达式连接该数据? 我有一个问题: