strem流对对象集合的某个字段分组
时间: 2024-02-23 08:03:04 浏览: 22
Java 8中的流可以使用Collectors.groupingBy()方法对对象集合中的某个字段进行分组。假设有一个Person类,其中包含id和name字段,可以使用以下代码根据id字段对Person对象集合进行分组操作:
```
List<Person> personList = new ArrayList<>();
//添加一些Person对象到personList
Map<Long, List<Person>> groupedPersons = personList.stream()
.collect(Collectors.groupingBy(Person::getId));
```
这个代码中,我们使用了Collectors.groupingBy()方法,它接受一个Function参数来提取对象的key,这里我们使用Person::getId方法作为key提取器。它将返回一个Map<Long, List<Person>>,其中key是id,value是包含该id的所有Person对象的列表。
相关问题
stream根据对象的字段对对象集合进行分组
在Java 8中,可以使用流处理框架提供的操作来根据对象的字段对对象集合进行分组。示例如下:
```java
List<Person> persons = ...; // 假设有一个Person对象集合,每个对象都有一个city属性
Map<String, List<Person>> personByCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity)); // 根据city字段进行分组,返回一个Map<String, List<Person>>对象
```
`groupingBy()`方法接受一个Function作为参数,用于从集合中的每个对象中获取分组依据的值。在上面的例子中,我们使用`Person::getCity`方法引用作为分组依据。
如果想要对分组后的结果进行进一步的操作,可以使用`Collectors.toMap()`等操作。例如,可以统计每个城市的Person对象数量:
```java
Map<String, Long> personCountByCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.counting())); // 统计每个城市的Person对象数量,返回一个Map<String, Long>对象
```
`counting()`方法返回一个收集器,用于计算分组后的元素数量。在上面的例子中,我们将`counting()`方法作为第二个参数传递给`groupingBy()`方法。
strem流对对象集合的某个字段去重
Java 8中的流可以使用distinct()方法对对象集合中的某个字段进行去重。假设有一个Person类,其中包含id和name字段,可以使用以下代码根据id字段对Person对象集合进行去重操作:
```
List<Person> personList = new ArrayList<>();
//添加一些Person对象到personList
List<Person> distinctPersons = personList.stream()
.filter(distinctByKey(Person::getId))
.collect(Collectors.toList());
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
```
这个代码中,我们使用了一个自定义的distinctByKey()方法,它返回一个Predicate对象,该对象接受Function参数来提取对象的key。我们使用ConcurrentHashMap来存储已经出现过的key,因为ConcurrentHashMap是线程安全的。最后,我们使用filter()方法将不重复的Person对象留下来,并使用collect()方法将它们收集到一个新的List中。