当list<B>和list<A>以多个字段进行匹配,且匹配到的件数比是N:M,将匹配成功的list<A>和list<B>出力。用java8写一段实现上述需求的共通方法
时间: 2024-05-14 16:15:04 浏览: 124
假设 A 和 B 类都有字段 a1 和 a2,用于匹配。
```
public static void match(List<A> listA, List<B> listB) {
Map<String, List<B>> bMap = listB.stream().collect(Collectors.groupingBy(b -> b.getA1() + b.getA2()));
for (A a : listA) {
List<B> matchList = bMap.get(a.getA1() + a.getA2());
if (matchList != null) {
System.out.println("Matched A: " + a);
System.out.println("Matched B: " + matchList);
}
}
}
```
首先将 listB 转换成 Map,以 a1 和 a2 的组合作为 key,每个 key 对应一个 B 对象的 List。然后遍历 listA,根据 a1 和 a2 的组合从 Map 中获取匹配的 B 对象的 List,如果不为 null,则输出匹配的 A 和 B 对象。
相关问题
<template> <div :class="prefixCls"> <div> <table style="width: 100%; margin: 10px auto 0 auto; border-collapse:collapse;"> <thead> <tr> <th colspan="12" style="padding: 10px;font-size:20px">常德芙蓉烟叶复烤有限责任公司</th> </tr> <tr> <th colspan="12" style="padding: 10px;font-size:18px">物资调拨承运结算单</th> </tr> <tr> <th colspan="9" style="padding: 10px 5px;"></th> <th colspan="1" style="padding: 10px 5px;">单据号:</th> <th colspan="2" style="padding: 10px 5px;text-align: left;">{{ rowData.splitNo }}</th> </tr> <tr> <th colspan="2" style="padding: 10px 5px;">发货仓库:</th> <th colspan="2" style="padding: 10px 5px;text-align: left;"><el-input v-if="isEditOut" v-model="this.orderData.dataList[0].outStoreName"></el-input><div v-else>{{ this.orderData.dataList[0].outStoreName }}</div></th> <th colspan="5" style="padding: 10px 5px;"></th> <th colspan="1" style="padding: 10px 5px;">记录编号:</th> <th colspan="2" style="padding: 10px 5px;text-align: left;">FRFK/YW/GL-05/03.0</th> </tr> <tr> <th colspan="2" style="padding: 10px 5px;">收货仓库:</th> <th colspan="2" style="padding: 10px 5px;text-align: left;">{{ this.orderData.dataList[0].inStoreName }}</th> <th colspan="5" style="padding: 10px 5px;">{{ time.format("YYYY年MM月DD日") }}</th> <th colspan="1" style="padding: 10px 5px;">单位:</th> <th colspan="2" style="padding: 10px 5px;text-align: left;">KG</th> </tr> </thead> <thead> <tr> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">类 别</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">品 种</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">年 度</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">产 地</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">等 级</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" colspan="2">应发数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" colspan="2">实发数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" colspan="2">实收数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;" rowspan="2">到货时间</th> </tr> <tr> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">件数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">重量</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">件数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">重量</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">件数</th> <th style="padding: 10px 5px;border: 1px solid #000;text-align: center;">重量</th> </tr> </thead> <tbody> <tr v-for="(item, index) in orderData.dataList" :key="index"> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.category }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.variety }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.planYear }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.placeOrigin }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.gradeNo }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ Math.ceil(item.amountKg/40)}}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;">{{ item.amountKg }}</td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;"><div v-if="showOut"><el-input v-if="isEditOut" v-model="item.realAmountPiece" ></el-input><div v-else>{{ item.realAmountPiece }}</div></div><div v-if="showIn">{{ item.realAmountPiece }}</div></td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;"><div v-if="showOut"><el-input v-if="isEditOut" v-model="item.realAmountKg" ></el-input><div v-else>{{ item.realAmountKg }}</div></div><div v-if="showIn">{{ item.realAmountKg }}</div></td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;"><div v-if="showIn"><el-input v-if="isEditIn" v-model="item.receiveAmountPiece" ></el-input><div v-else>{{item.receiveAmountPiece}}</div></div></td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;"><div v-if="showIn"><el-input v-if="isEditIn" v-model="item.receiveAmountKg" ></el-input><div v-else>{{item.receiveAmountKg}}</div></div></td> <td style="padding: 10px 5px;border: 1px solid #000;text-align: center;"><el-date-picker v-if="showIn" v-model="item.arrivedTime" type="datetime" placeholder="选择日期时间" format="yyyy-MM-dd " value-format="yyyy-MM-dd" value="time"></el-date-picker></td> </tr> <tr> <th colspan="1" style="padding: 10px 5px;border: 1px solid #000;">备注:</th> <th colspan="11" style="padding: 10px 5px;border: 1px solid #000;text-align: left;">{{ this.orderData.dataList[0].remark }}</th> </tr> </tbody> </table> <ul style="display: flex; flex-wrap: wrap; justify-content: space-between;font-weight: 700;"> <li style="width: 30%; margin: 10px 0 0px; list-style: none"> 制单:{{ this.orderData.dataList[0].createUserName }} </li> <li style="width: 30%; margin: 10px 0 0px; list-style: none"> 发货保管员: </li> <li style="width: 30%; margin: 10px 0 0px; list-style: none"> 汽车车号: </li> <li style="width: 30%; margin: 10px 0; list-style: none"> 承运司机: </li> <li style="width: 30%; margin: 10px 0; list-style: none"> 收货保管员: </li> <li style="width: 30%; margin: 10px 0; list-style: none"> </li> </ul> <ul style="display: flex; flex-wrap: wrap; justify-content: space-between;"> <li style="width: 25%; margin: 10px 0 0px; list-style: none"> 第一联:发货保管员 </li> <li style="width: 25%; margin: 10px 0 0px; list-style: none"> 第二联:运费结算凭证 </li> <li style="width: 25%; margin: 10px 0 0px; list-style: none"> 第三联:收货保管员 </li> <li style="width: 25%; margin: 10px 0; list-style: none"> 第四联:门卫 </li> </ul> </div> </div> </template> <script> import moment from 'moment' export default { name: "orderDetailPdf", props: { showOut: { type: Boolean, default: false, }, isEditOut: { type: Boolean, default: false, }, showIn: { type: Boolean, default: false, }, isEditIn: { type: Boolean, default: false, }, rowData: { type: Object, default: {}, } }, data() { return { prefixCls: "orderDetailPdf", row: {}, orderData: { dataList:[], }, orderStatus: { 10: "待付款", 20: "待审核", 30: "管理员取消", 35: "会员取消", 40: "审核不通过", 50: "审核通过", 80: "已回收", 90: "已完成", }, time: new Date(), }; }, created() {}, mounted() { if(this.rowData.splitItemId) { this.findItemData(this.rowData.splitItemId); } else if (this.rowData) { this.findItemData(this.rowData); } else { this.orderData.dataList = [{ category: "", variety: "", planYear: "", placeOrigin: "", gradeNo: "", amountKg: 0, realAmountPiece: 0, realAmountKg: 0, ReceiveAmountPiece: 0, ReceiveAmountKg: 0, outStoreName: "", inStoreName: "", remark: "", createUserName: "" }]; } this.time = moment(this.time); for (let i = 0; i < this.orderData.dataList.length; i++) { if(this.isEditIn){ this.orderData.dataList[i].receiveAmountPiece = this.orderData.dataList[i].realAmountPiece; this.orderData.dataList[i].receiveAmountKg = this.orderData.dataList[i].realAmountKg; } else if(this.isEditOut){ this.orderData.dataList[i].realAmountPiece = this.orderData.dataList[i].amountPiece; this.orderData.dataList[i].realAmountKg = this.orderData.dataList[i].amountKg; } } }, methods: { findItemData(id){ this.$axios({ method: "post", url: `${this.global.MSI_STORAGE}/splitAllot/findSplitAllotPrint`, data: { data:{ splitItemId: id } }, }).then((res) => { if (res.data.status === "Y") { this.orderData.dataList = [res.data.data]; } else { this.$message.error(res.data.message); this.orderData.dataList = [{ category: "", variety: "", planYear: "", placeOrigin: "", gradeNo: "", amountKg: 0, realAmountPiece: 0, realAmountKg: 0, ReceiveAmountPiece: 0, ReceiveAmountKg: 0, outStoreName: "", inStoreName: "", remark: "", createUserName: "" }]; } }); }, formatDateYMD (date) { if (!date) { return '' } return moment(date).format('YYYY-MM-DD') }, mathFormatter(num) { if (isNaN(parseFloat(num))) { return null; } var formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2, }); var n = formatter.format(num).replace(',', '') return n }, collectFormData() { return { splitItemId: this.orderData.dataList[0].splitItemId, realAmountPiece: this.orderData.dataList[0].realAmountPiece, realAmountKg: this.orderData.dataList[0].realAmountKg, receiveAmountPiece: this.orderData.dataList[0].receiveAmountPiece, receiveAmountKg: this.orderData.dataList[0].receiveAmountKg, arrivedTime: this.orderData.dataList[0].arrivedTime, outStoreName: this.orderData.dataList[0].outStoreName, }; } }, }; </script> <style lang="scss" scoped> $prefixCls: "orderDetailPdf"; .#{$prefixCls} { } </style>该vue中若isEditOut为真,则表示为出库编辑,此时item.realAmountKg表格项为输入,且其默认值需为item.amount,在mounted的for循环中欲实现此功能,但是失败了,怎么实现
<think>我们正在处理一个Vue组件中的需求:根据`isEditOut`状态,设置`item.realAmountKg`的默认值为`item.amountKg`,并在表格中显示为可编辑的输入框。
思路:
1. 在表格中,我们需要根据`isEditOut`的值来决定显示文本还是输入框。
2. 当`isEditOut`为真时,显示一个输入框,并且将输入框的值绑定到`item.realAmountKg`;当`isEditOut`为假时,显示`item.realAmountKg`(或者可能是`item.amountKg`,但根据需求,我们设置默认值后,应该显示`realAmountKg`)。
3. 关于设置默认值:我们需要在某个时机(比如数据初始化时,或者当`isEditOut`状态改变时)将`item.realAmountKg`设置为`item.amountKg`。注意,如果`item.realAmountKg`已经存在值(比如之前编辑过),我们可能不希望覆盖它,所以设置默认值的逻辑应该是:如果`realAmountKg`不存在或者需要重置时,才设置为`amountKg`。
实现方案:
方案1:在初始化数据时,或者在获取到数据后,遍历数据项,为每个item添加`realAmountKg`属性,如果`realAmountKg`不存在,则设置为`amountKg`的值。
方案2:在模板中,我们可以使用计算属性或者方法,但是考虑到实时性,我们可以在渲染时动态决定,但这样可能会导致无法正确绑定(因为需要可编辑,所以需要绑定到数据的一个属性上)。因此,更推荐在数据层面处理。
步骤:
1. 在数据获取后,我们遍历数组,为每个对象设置`realAmountKg`属性(如果还没有设置的话)。
2. 在表格的列中,使用`v-if`和`v-else`来切换显示输入框和文本。
示例代码:
假设我们的数据是通过一个数组`tableData`来存储的,每个元素是一个`item`对象。
在获取数据后(比如在`mounted`或者`created`钩子中,或者从API获取数据后),我们进行初始化:
```javascript
// 假设这是从API获取的数据
this.tableData = response.data.map(item => {
// 如果item没有realAmountKg属性,则设置默认值为amountKg
if (item.realAmountKg === undefined || item.realAmountKg === null) {
// 使用Vue的set确保响应性
this.$set(item, 'realAmountKg', item.amountKg);
}
return item;
});
```
或者,我们可以在数据中本身就包含`realAmountKg`,那么就不需要处理。但如果不包含,我们需要设置。
在表格中,我们可以这样写:
```html
<template v-for="(item, index) in tableData">
<!-- 其他列省略 -->
<td>
<template v-if="isEditOut">
<input type="text" v-model="item.realAmountKg" />
</template>
<template v-else>
{{ item.realAmountKg }}
</template>
</td>
</template>
```
但是,注意:如果`isEditOut`状态是全局的(比如整个表格的编辑状态),那么我们可以这样用。如果每个item有自己的编辑状态,那么可能需要一个字段来控制。
根据需求,我们有一个全局的`isEditOut`状态,所以可以这样。
然而,我们可能需要在`isEditOut`状态改变时,重置`realAmountKg`为`amountKg`?需求是设置默认值,但通常默认值只在初始化时设置一次。如果需求是每次进入编辑状态时,都将`realAmountKg`重置为`amountKg`,那么我们需要在`isEditOut`变为true的时候,遍历所有项并重置。
但是,注意:重置可能会覆盖用户已经编辑过的值。所以,需求可能是在进入编辑状态时,如果之前没有编辑过(即`realAmountKg`没有被修改过),则重置为`amountKg`。但这样就需要记录初始状态,比较复杂。
根据问题描述,我们只需要在设置时给默认值,所以我们可以这样:在初始化数据时设置一次,之后编辑状态改变时不再重置,除非有明确要求。
因此,我们只需要在数据初始化时设置默认值即可。
如果需求是每次切换到编辑状态时,都要重置为`amountKg`,那么我们可以这样做:
在`isEditOut`变为true的时候,遍历数组,将每个`item.realAmountKg`设置为`item.amountKg`(注意,这样会覆盖已有的编辑)。
所以,我们需要明确需求。根据问题描述:“设置默认值”,通常是在初始化时。所以这里我们按照初始化时设置默认值。
但是,如果数据是动态加载的,那么每次加载新数据时都需要设置。
总结步骤:
1. 在获取数据后,为每个item设置`realAmountKg`(如果该属性不存在,则设置为`amountKg`的值)。
2. 在表格中,根据`isEditOut`的值显示输入框或文本。
注意:使用`v-model`绑定输入框,这样用户输入的值会自动更新到`item.realAmountKg`。
另外,如果表格中还有其他列需要编辑,也可以使用同样的方式。
下面是一个完整的Vue组件的示例代码:
```vue
<template>
<div>
<table>
<thead>
<tr>
<th>其他列</th>
<th>重量(kg)</th>
</tr>
</thead>
<tbody>
<tr v-for="(item, index) in tableData" :key="index">
<td>其他数据</td>
<td>
<input v-if="isEditOut" type="text" v-model="item.realAmountKg" />
<span v-else>{{ item.realAmountKg }}</span>
</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
data() {
return {
isEditOut: false, // 初始状态为不可编辑
tableData: [] // 初始数据为空
};
},
created() {
// 假设我们有一个方法获取数据
this.fetchData();
},
methods: {
fetchData() {
// 模拟从API获取数据
// 假设返回的数据结构为: { data: [ { amountKg: 100, ... }, ... ] }
const response = { data: [{ amountKg: 100 }, { amountKg: 200 }] };
this.tableData = response.data.map(item => {
// 如果item没有realAmountKg属性,则设置默认值为amountKg
// 注意:这里我们使用Vue.set来确保新属性是响应式的
if (item.realAmountKg === undefined || item.realAmountKg === null) {
// 这里我们直接给item添加属性,因为Vue无法检测到普通对象的新增属性,所以使用$set
this.$set(item, 'realAmountKg', item.amountKg);
}
return item;
});
}
}
};
</script>
```
注意:在`fetchData`方法中,我们使用了`this.$set`来设置`realAmountKg`属性,这样Vue才能监听到这个属性的变化。因为直接给对象添加新属性不是响应式的。
另外,如果`isEditOut`状态需要切换,我们可以通过一个按钮或者外部事件来改变,然后表格就会相应地显示输入框或文本。
如果需求是每次切换到编辑状态时,都要将`realAmountKg`重置为`amountKg`(即覆盖之前的编辑),那么我们可以添加一个监听`isEditOut`的watch:
```javascript
watch: {
isEditOut(newVal) {
if (newVal) {
// 进入编辑状态,重置所有realAmountKg为amountKg
this.tableData.forEach(item => {
item.realAmountKg = item.amountKg;
});
}
}
}
```
但是,这个重置会覆盖用户之前编辑的值,所以是否这样做取决于业务需求。
如果需求是每次进入编辑状态时,如果用户没有编辑过(即realAmountKg没有被修改过),则重置,那么我们需要记录初始值。这可能会复杂一些,我们可以考虑在数据中存储一个原始值,然后在编辑时使用原始值重置。或者,在进入编辑状态时,先保存当前值,然后提供一个重置按钮等。
由于问题中没有明确要求,我们这里按照初始化设置默认值,不自动重置。
因此,最终代码如上所示。
相关问题:
1. 在Vue中,如何动态设置对象的属性并保持响应式?
2. Vue中如何根据条件切换输入框和文本显示?
3. 在Vue中,如何监听状态变化并执行数据重置操作?</think>### 在Vue组件中实现可编辑表格字段
在Vue组件中实现根据`isEditOut`状态设置`item.realAmountKg`默认值并使其可编辑,可以通过以下步骤实现:
#### 1. 数据初始化与默认值设置
```vue
<script>
export default {
data() {
return {
tableData: [], // 表格数据
isEditOut: false // 编辑状态控制
}
},
watch: {
// 当编辑状态变化时设置默认值
isEditOut(newVal) {
if (newVal) {
this.tableData.forEach(item => {
// 仅在realAmountKg未设置时使用amountKg作为默认值
if (item.realAmountKg === null || item.realAmountKg === undefined) {
this.$set(item, 'realAmountKg', item.amountKg)
}
})
}
}
}
}
</script>
```
#### 2. 表格模板实现
```vue
<template>
<table>
<tr v-for="(item, index) in tableData" :key="index">
<!-- 其他列... -->
<td>
<template v-if="isEditOut">
<!-- 可编辑输入框 -->
<input
v-model="item.realAmountKg"
type="number"
@blur="validateInput(item)"
>
</template>
<template v-else>
<!-- 只读显示 -->
{{ item.realAmountKg || item.amountKg }}
</template>
</td>
</tr>
</table>
</template>
```
#### 3. 输入验证(可选)
```javascript
methods: {
validateInput(item) {
// 确保输入有效值
if (isNaN(item.realAmountKg) || item.realAmountKg < 0) {
this.$set(item, 'realAmountKg', item.amountKg)
}
}
}
```
### 关键实现说明
1. **响应式数据设置**
使用`this.$set()`确保新添加的`realAmountKg`属性是响应式的,避免直接赋值导致的响应性丢失问题[^1]。
2. **条件渲染逻辑**
通过`v-if="isEditOut"`控制输入框的显示,非编辑状态显示静态文本。
3. **默认值策略**
仅在`realAmountKg`未定义时使用`amountKg`作为默认值,保留用户已编辑的值。
4. **输入验证**
添加简单的数值验证,确保输入值的有效性。
### 优化建议
1. 使用计算属性处理默认值逻辑:
```javascript
computed: {
processedData() {
return this.tableData.map(item => ({
...item,
realAmountKg: item.realAmountKg ?? item.amountKg
}))
}
}
```
2. 对于复杂表格,建议使用专门的表格组件(如Element UI的el-table):
```vue
<el-table-column prop="amount">
<template #default="{ row }">
<el-input
v-if="isEditOut"
v-model.number="row.realAmountKg"
/>
<span v-else>{{ row.realAmountKg || row.amountKg }}</span>
</template>
</el-table-column>
```
3. 添加编辑状态指示器:
```vue
<input
v-model="item.realAmountKg"
:class="{ 'editing': isEditOut }"
>
<style>
.editing {
border: 1px solid #409EFF;
background-color: #f5f7fa;
}
</style>
```
List<PatentResultListVO> filteredList 有字段 /** * 已评估件数 */ private Long evaluatedCount; /** * 维持件数 */ private Long maintainCount; /** * 维持费用 */ private BigDecimal maintainCosts; /** * 放弃件数 */ private Long giveUpCount; /** * 放弃费用 */ private BigDecimal giveUpCosts; 计算总计,然后放在list的第一位
你希望将 `List<PatentResultListVO>` 中的某些字段进行 **总计计算**(如 `evaluatedCount`、`maintainCount`、`maintainCosts`、`giveUpCount`、`giveUpCosts`),并将计算结果作为新的 `PatentResultListVO` 对象插入到列表的 **第一位**。
---
### ✅ 解决方案
你可以使用 Java Stream 对列表进行遍历并汇总字段值,然后构造一个汇总对象插入到列表头部。
---
### ✅ Java 实现代码如下:
```java
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class PatentSummaryUtil {
public static List<PatentResultListVO> addSummaryToFirst(List<PatentResultListVO> list) {
if (list == null || list.isEmpty()) {
return list;
}
// 初始化汇总对象
PatentResultListVO summary = new PatentResultListVO();
summary.setEvaluatedCount(list.stream().map(PatentResultListVO::getEvaluatedCount).filter(Objects::nonNull).mapToLong(Long::longValue).sum());
summary.setMaintainCount(list.stream().map(PatentResultListVO::getMaintainCount).filter(Objects::nonNull).mapToLong(Long::longValue).sum());
summary.setGiveUpCount(list.stream().map(PatentResultListVO::getGiveUpCount).filter(Objects::nonNull).mapToLong(Long::longValue).sum());
// BigDecimal 需要手动累加
BigDecimal maintainCostsSum = BigDecimal.ZERO;
for (PatentResultListVO vo : list) {
if (vo.getMaintainCosts() != null) {
maintainCostsSum = maintainCostsSum.add(vo.getMaintainCosts());
}
}
summary.setMaintainCosts(maintainCostsSum);
BigDecimal giveUpCostsSum = BigDecimal.ZERO;
for (PatentResultListVO vo : list) {
if (vo.getGiveUpCosts() != null) {
giveUpCostsSum = giveUpCostsSum.add(vo.getGiveUpCosts());
}
}
summary.setGiveUpCosts(giveUpCostsSum);
// 设置汇总项的其他字段(可选)
summary.setDept("总计"); // 示例字段,用于标识
// 插入到列表第一位
List<PatentResultListVO> result = new ArrayList<>();
result.add(summary);
result.addAll(list);
return result;
}
}
```
---
### ✅ VO 类定义示例:
```java
import java.math.BigDecimal;
public class PatentResultListVO {
private String dept;
private Long evaluatedCount;
private Long maintainCount;
private BigDecimal maintainCosts;
private Long giveUpCount;
private BigDecimal giveUpCosts;
// Getters and Setters
}
```
---
### ✅ 使用示例:
```java
List<PatentResultListVO> resultListVOS = ...; // 初始化你的列表数据
List<PatentResultListVO> listWithSummary = PatentSummaryUtil.addSummaryToFirst(resultListVOS);
```
---
### ✅ 说明:
- 使用 Java Stream 对 `Long` 类型字段进行累加。
- `BigDecimal` 不支持 `mapToDouble`,需要手动累加。
- 汇总对象设置 `"总计"` 字段用于标识这是汇总行。
- 最终返回的新列表中,汇总对象位于第一位。
---
阅读全文
相关推荐












