java中的Collectors.groupingBy()和Collectors.filtering()怎么使用,举例子说明
时间: 2024-08-16 14:00:55 浏览: 82
`Collectors.groupingBy()` 是 Java Stream API 中的一个收集器,用于将流中的元素根据某些属性进行分组。它通常与 `Collectors.mapping()` 结合使用,以便在分组后对每个组内的元素执行进一步的转换或收集操作。`Collectors.filtering()` 也是一个收集器,用于根据提供的谓词对流进行过滤,只收集那些满足条件的元素。
下面是使用 `Collectors.groupingBy()` 和 `Collectors.filtering()` 的例子:
```java
import java.util.*;
import java.util.stream.*;
import static java.util.stream.Collectors.*;
public class GroupingAndFilteringExample {
public static void main(String[] args) {
// 创建一个商品列表
List<Product> products = Arrays.asList(
new Product("书籍", "文学", 90.0),
new Product("书籍", "历史", 120.0),
new Product("电子书", "文学", 60.0),
new Product("电子书", "历史", 70.0),
new Product("游戏", "动作", 150.0)
);
// 使用 groupingBy 分组,先按类型分组,再按分类分组
Map<String, Map<String, List<Product>>> groupedByTypeAndCategory = products.stream()
.collect(groupingBy(Product::getType, groupingBy(Product::getCategory)));
// 打印分组结果
groupedByTypeAndCategory.forEach((type, categoryMap) -> {
System.out.println("Type: " + type);
categoryMap.forEach((category, productsList) -> {
System.out.println(" Category: " + category);
productsList.forEach(product -> System.out.println(" " + product.getName() + " - " + product.getPrice()));
});
});
// 使用 filtering 过滤价格大于100的商品
Map<String, List<Product>> filteredProducts = products.stream()
.collect(groupingBy(Product::getType,
filtering(product -> product.getPrice() > 100, toList())));
// 打印过滤后的结果
filteredProducts.forEach((type, productsList) -> {
System.out.println("Filtered type: " + type);
productsList.forEach(product -> System.out.println(" " + product.getName() + " - " + product.getPrice()));
});
}
}
class Product {
private String name;
private String category;
private double price;
public Product(String name, String category, double price) {
this.name = name;
this.category = category;
this.price = price;
}
public String getName() {
return name;
}
public String getCategory() {
return category;
}
public double getPrice() {
return price;
}
public String getType() {
return this instanceof EBook ? "电子书" : "书籍";
}
// ... toString method for better printing ...
}
```
在这个例子中,我们首先创建了一个 `Product` 类的列表,然后使用 `groupingBy()` 对产品进行分组,首先是按类型(书籍或电子书),然后是按分类(文学、历史、动作等)。接着,我们使用 `filtering()` 结合 `groupingBy()` 对产品进行过滤,只保留价格大于100的产品,并按类型分组。
阅读全文