Java8 stearm 对集合中对象的多个字段进行求和
时间: 2024-05-11 16:17:22 浏览: 6
可以使用Java8 Stream API中的reduce()方法来对集合中对象的多个字段进行求和。假设有一个包含多个对象的列表List<MyObject>,MyObject类中有两个字段:field1和field2,可以按如下方式对它们进行求和:
```
int sumField1 = myList.stream().mapToInt(MyObject::getField1).sum();
int sumField2 = myList.stream().mapToInt(MyObject::getField2).sum();
```
这里使用了mapToInt()方法将对象的字段映射为int类型的流,并使用sum()方法对这个流进行求和。你也可以使用reduce()方法对多个字段进行求和:
```
MyObject sumObject = myList.stream().reduce(new MyObject(0, 0),
(obj1, obj2) -> new MyObject(obj1.getField1() + obj2.getField1(),
obj1.getField2() + obj2.getField2()));
```
这里reduce()方法接受一个起始值和一个Lambda表达式,Lambda表达式中将两个对象的字段分别相加并返回一个新的对象。最终返回的对象sumObject中包含了所有对象的字段之和。
相关问题
Java8 stream 中利用 groupingBy 进行多字段分组求和
在Java 8的Stream中,可以使用groupingBy方法进行多字段分组求和。首先,我们需要创建一个包含对象的集合,然后使用stream方法将其转换为流。接下来,我们可以使用groupingBy方法来指定多个字段作为分组条件。每个字段都可以通过lambda表达式来指定。最后,我们可以使用collect方法来收集结果。
示例代码如下:
```
List<Item> items = Arrays.asList(
new Item("apple", "China"),
new Item("apple", "USA"),
new Item("banana", "China"),
new Item("banana", "USA"),
new Item("orange", "China"),
new Item("orange", "USA")
);
Map<String, Map<String, Long>> result = items.stream()
.collect(Collectors.groupingBy(Item::getProductType,
Collectors.groupingBy(Item::getCountry, Collectors.counting())));
System.out.println(result);
```
在这个示例中,我们创建了一个包含产品类型和国家的Item对象集合。然后,我们使用stream方法将其转换为流。接下来,我们使用groupingBy方法指定了两个字段作为分组条件,即产品类型和国家。最后,我们使用collect方法来收集结果,并将结果存储在一个嵌套的Map中,其中外层的键是产品类型,内层的键是国家,值是对应的计数。
输出结果将会是一个嵌套的Map,其中外层的键是产品类型,内层的键是国家,值是对应的计数。
#### 引用[.reference_title]
- *1* *3* [Java8 stream 中利用 groupingBy 进行多字段分组求和](https://blog.csdn.net/lizhengyu891231/article/details/108997080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [Java8 stream 中利用 groupingBy 进行多字段分组](https://blog.csdn.net/weixin_39637363/article/details/113543899)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
java8 stream 中利用 groupingby 进行多字段分组求和案例
Java 8引入了Stream API,有许多新方法,其中有一个对于分组和聚合操作非常有用,那就是groupingBy()方法。它可以将一个流分组成一个Map,其中Entry的key是分组的条件,value是分组的结果,通常是一个List或其他集合。groupingBy()方法的另一个形式是groupingByConcurrent(),它返回一个并发Map,对于并发访问更加友好。
利用groupingBy()方法进行多字段分组和求和操作的示例如下:
假设有一个Person类,其中包含属性:name, age和salary。现在我们需要根据name和age两个字段进行分组,并求出每组的salary总和。可以使用groupingBy()方法加上summingDouble()方法来实现:
```
List<Person> persons = Arrays.asList(
new Person("Tom", 20, 5000),
new Person("Tom", 21, 4000),
new Person("Jerry", 22, 6000),
new Person("Jerry", 23, 5500),
new Person("Kate", 24, 7000),
new Person("Kate", 25, 8000)
);
Map<String, Map<Integer, Double>> result = persons.stream()
.collect(Collectors.groupingBy(Person::getName,
Collectors.groupingBy(Person::getAge,
Collectors.summingDouble(Person::getSalary))));
```
这里的personList是一个包含了6个Person对象的List,我们希望将其中相同name和age的对象分组,求得salary的总和。在groupingBy()方法中,第一个参数是分组条件,这里是Person::getName,第二个参数是分组的结果,这里是一个嵌套的groupingBy()方法,用于再次按照age进行分组,结果是一个Map<Integer, Double>。最后,我们使用summingDouble()方法对salary字段进行求和,得到各个分组的salary总和。这里的result是一个Map<String, Map<Integer, Double>>类型的对象,其中key是name,value是以age为key,salary总和为value的子Map,就是我们需要的结果。
这样,我们就利用Java 8中的Stream API和groupingBy()方法进行了多字段分组和求和操作,代码简洁,可读性强,非常方便。