解释这行代码List<DataColumnDTO> fromNodeTableKeyColumns = dataTableColumnMap.values().stream().flatMap((list) -> list.stream()).filter((c) -> c.getId().equals(columnIdInMapping)).collect(Collectors.toList());
时间: 2024-04-23 21:21:55 浏览: 102
这行代码的作用是从一个Map中获取所有的DataColumnDTO对象,并筛选出它们中包含特定columnIdInMapping的对象,然后将这些对象存入一个List中返回。
具体来说,这行代码的执行步骤如下:
1. dataTableColumnMap是一个Map,它的键是String类型的,值是一个List<DataColumnDTO>类型的集合。
2. 调用map中的values()方法获取Map中所有的List<DataColumnDTO>对象,这些对象被组合成一个Stream流。
3. 调用flatMap方法将Stream中的所有List<DataColumnDTO>对象转换成一个新的Stream流,其中包含所有的DataColumnDTO对象。
4. 调用filter方法过滤出所有id等于columnIdInMapping的DataColumnDTO对象。
5. 调用collect方法将过滤出的DataColumnDTO对象收集到一个List中并返回。
需要注意的是,这行代码使用了Java 8中的Stream API,它可以帮助我们更加方便地对集合进行操作和处理。
相关问题
List<String> realValueFieldIds = accountFieldCollectionMap.values().stream().map(ConfAccountField::getFieldRelation).collect(Collectors.toList()); Map<String, ConfAccountField> fieldMap = MapUtil.transformUniqueIndexMap(confAccountFieldMap.values(), ConfAccountField::getFieldId); List<ConfAccountField> realSiteFields = realValueFieldIds.stream().map(fieldMap::get).filter(Objects::nonNull).distinct().collect(Collectors.toList());
这段代码使用了Java 8的Stream API,主要是对一些集合进行操作。具体来说,代码首先从一个名为accountFieldCollectionMap的Map中取出所有的值,即一个ConfAccountField对象的集合,然后对每个对象调用getFieldRelation方法,获取其关联的字段的ID,并将这些ID收集到一个List<String>中。
接下来,代码将confAccountFieldMap的所有值转化为一个Map<String, ConfAccountField>,其中键为ConfAccountField对象的getFieldId方法返回的ID,值为ConfAccountField对象本身。然后,代码从realValueFieldIds中取出每个ID,通过get方法从fieldMap中获取相应的ConfAccountField对象,如果对象存在且没有重复,则将其收集到一个List<ConfAccountField>中。
综上所述,这段代码的作用是根据一个Map中ConfAccountField对象的关联字段的ID,获取所有对应的ConfAccountField对象,并去除重复的对象。
List<ExpenseStatisticsDTO> expenseFlightByDept = travelExpensesRepository.getExpenseFlightByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseTrainByDept = travelExpensesRepository.getExpenseTrainByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseHotelByDept = travelExpensesRepository.getExpenseHotelByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseZSByDept = travelExpensesRepository.getExpenseZSByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseJTByDept = travelExpensesRepository.getExpenseJTByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseBTByDept = travelExpensesRepository.getExpenseBTByDept(expenseStatisticsDTO); List<ExpenseStatisticsDTO> expenseOtherByDept = travelExpensesRepository.getExpenseOtherByDept(expenseStatisticsDTO); Java把以上List合并成一个List,按ExpenseStatisticsDTO对象中structNo相同的情况下,则把totalPrice相加,最后返回List<ExpenseStatisticsDTO>
可以使用Java 8中的Stream API来实现List合并和按照structNo相同的情况下把totalPrice相加的操作。实现代码如下:
```java
List<ExpenseStatisticsDTO> mergedList = Stream.of(expenseFlightByDept, expenseTrainByDept, expenseHotelByDept, expenseZSByDept, expenseJTByDept, expenseBTByDept, expenseOtherByDept)
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(ExpenseStatisticsDTO::getStructNo, Collectors.reducing(
new ExpenseStatisticsDTO("", "", 0.0),
(a, b) -> new ExpenseStatisticsDTO(b.getStructNo(), b.getStructName(), a.getTotalPrice() + b.getTotalPrice()),
(a, b) -> new ExpenseStatisticsDTO(b.getStructNo(), b.getStructName(), a.getTotalPrice() + b.getTotalPrice())
)))
.values()
.stream()
.sorted(Comparator.comparing(ExpenseStatisticsDTO::getStructNo))
.collect(Collectors.toList());
```
上述代码中,首先将多个List加入到一个Stream中,然后通过flatMap方法将多个Stream扁平化为一个Stream。接着使用groupingBy方法按structNo分组,使用reducing方法将同一组的ExpenseStatisticsDTO对象的totalPrice相加,并将结果转换为一个新的ExpenseStatisticsDTO对象。最后通过values方法取出所有的分组结果,通过sorted方法按照structNo排序,并通过collect方法将结果转换为List,即可得到合并后的List。
阅读全文