java8 stream 集合多个字段例子
时间: 2023-11-02 09:53:29 浏览: 131
可以给您举一个Java8 Stream集合多个字段的例子。假设我们有一个Person类,有name、age和city三个字段,我们希望通过Stream对List进行排序,优先按照city升序排序,city相同的再按照age降序排序。代码如下:
List<Person> persons = new ArrayList<>();
persons.add(new Person("Alice", 25, "New York"));
persons.add(new Person("Tom", 30, "Beijing"));
persons.add(new Person("Bob", 35, "New York"));
persons.add(new Person("Jack", 30, "Beijing"));
List<Person> sortedPersons = persons.stream()
.sorted(Comparator.comparing(Person::getCity)
.thenComparing(Comparator.comparing(Person::getAge).reversed()))
.collect(Collectors.toList());
这样就可以得到按照city升序和age降序排序后的List了。
相关问题
java stream map 多个字段
### Java Stream API 处理多个字段
当使用 Java Stream API 的 `map` 方法来处理对象中的多个字段时,通常会创建一个新的对象实例,在其中包含转换后的字段值。下面是一个具体的例子,展示如何通过流操作映射并更新对象的多个属性。
假设有一个表示用户的类:
```java
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and setters omitted for brevity
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}
}
```
现在想要将用户列表中每个人的年龄增加一岁,并且把名字改为大写形式。可以这样做:
```java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
List<User> users = Arrays.asList(
new User("Alice", 30),
new User("Bob", 25)
);
// 使用stream().map方法修改每个元素的名字和年龄
List<User> updatedUsers = users.stream()
.map(user -> new User(user.getName().toUpperCase(), user.getAge() + 1))
.collect(Collectors.toList());
System.out.println(updatedUsers);
```
这段代码首先定义了一个简单的 `User` 类用于存储姓名和年龄信息。接着创建了一组初始数据作为输入源。最后利用 `stream()` 和 `map()` 函数遍历整个集合并对每一个项目应用指定的操作——这里就是创建新的 `User` 对象并将原对象的名字转成大写字母以及使年龄加一[^1]。
java list集合stream流某一个字段分组
### 使用Java Stream API按字段对列表进行分组并收集到映射
为了实现基于对象某个字段的分组操作并将结果收集至`Map`,可以利用`Collectors.groupingBy()`方法。此方法允许指定分类函数作为参数来定义分组依据[^1]。
下面是一个具体的例子,假设有一个名为`Employee`的对象类,其中包含员工的名字(`name`)、部门(`dept`)以及工资(`salary`)属性:
```java
import java.util.*;
import java.util.stream.Collectors;
class Employee {
private String name;
private String dept;
private double salary;
public Employee(String name, String dept, double salary) {
this.name = name;
this.dept = dept;
this.salary = salary;
}
// Getters...
@Override
public String toString() {
return "Employee{name='" + name + "', dept='" + dept + "', salary=" + salary + '}';
}
}
public class Main {
public static void main(String[] args) {
List<Employee> employees = Arrays.asList(
new Employee("Alice", "HR", 7000),
new Employee("Bob", "Engineering", 9000),
new Employee("Charlie", "HR", 6500)
);
Map<String, DoubleSummaryStatistics> result =
employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.summarizingDouble(Employee::getSalary)));
System.out.println(result);
}
}
```
上述代码展示了如何通过`groupingBy`按照部门名称分组,并且对于每一个分组计算该部门内所有成员薪资的相关统计信息(如平均数、总数等),这里使用的是`summarizingDouble`收集器。
如果目标是在分组的同时执行多种聚合运算,则可以通过嵌套收集器的方式完成。例如,在同一个分组下既求得某字段之和又获取其均值:
```java
Map<String, Tuple<Double, Double>> complexResult =
employees.stream()
.collect(Collectors.groupingBy(Employee::getDept,
Collectors.collectingAndThen(
Collectors.teeing(
Collectors.summingDouble(Employee::getSalary),
Collectors.averagingDouble(Employee::getSalary),
(total, avg) -> new Tuple<>(total, avg))
)
));
```
在这个复杂版本的例子中,引入了一个自定义的二元组(Tuple)用于存储两个不同类型的聚合结果——总和与平均值。需要注意的是,实际项目里可能需要创建这样的辅助类或采用其他形式的数据结构来容纳多维度的结果数据。
阅读全文
相关推荐















