Optional<Integer> sumSalary = personList.stream().map(Person::getSalary).reduce(Integer::sum);还能怎么写
时间: 2024-03-03 14:48:45 浏览: 86
这段代码可以使用简化的方式重写,如下所示:
```
int sumSalary = personList.stream().mapToInt(Person::getSalary).sum();
```
这里使用了`mapToInt`方法将`Person`对象的薪资映射为一个`IntStream`,然后使用`sum`方法将其求和。这种方式比使用`reduce`方法更加简洁明了。
相关问题
Map<Integer, Person> personMap = personList.stream().collect(Collectors.toMap(Person::getId, Function.identity())); 去重
如果你想根据 Person 对象的 id 字段进行去重,可以在 toMap 方法中增加一个 mergeFunction 参数,用于合并重复键的值。例如:
```
Map<Integer, Person> personMap = personList.stream()
.collect(Collectors.toMap(Person::getId, Function.identity(), (p1, p2) -> p1));
```
上面的代码中,当出现重复的键(即两个 Person 对象的 id 相同时),我们选择保留第一个对象的值,即 p1。如果你想保留最后一个对象的值,可以修改为 `(p1, p2) -> p2`。
Map<?, Person> map = personList.stream().filter(p -> p.getSalary() > 8000) .collect(Collectors.toMap(Person::getName, p -> p));
### 将 `Person` 对象列表转换为以姓名为键的映射
可以利用 Java Stream API 的 `filter()` 和 `Collectors.toMap()` 方法实现这一目标。以下是具体方法:
首先,可以通过 `filter()` 方法筛选满足特定条件的对象[^1]。接着,使用 `Collectors.toMap()` 方法将符合条件的 `Person` 对象收集到一个 `Map<String, Person>` 中,其中键为 `Person` 对象的名字。
下面是一个完整的代码示例,假设有一个名为 `people` 的 `List<Person>` 列表,并希望将其转化为以名字作为键的 `Map`:
```java
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
Map<String, Person> result = people.stream()
.filter(person -> person.getAge() > 27) // 过滤年龄大于27的人
.collect(Collectors.toMap(Person::getName, person -> person));
System.out.println(result);
}
}
```
上述代码中,`.filter(person -> person.getAge() > 27)` 是用于过滤掉不符合条件的数据项;而 `.collect(Collectors.toMap(Person::getName, person -> person))` 则负责创建一个新的 `Map`,其中键是从 `Person` 对象提取出来的名字,值则是对应的整个 `Person` 实体对象[^3]。
如果存在重复键的情况,则需要指定解决冲突的方法。例如,在遇到相同名称时保留第一个出现的记录,可修改如下:
```java
.collect(Collectors.toMap(
Person::getName,
person -> person,
(existing, replacement) -> existing));
```
这里 `(existing, replacement) -> existing` 表明当发生键冲突时优先保持现有的条目不变。
#### 注意事项
- 如果输入数据可能包含 null 值或者空字符串作为 key,则需额外注意处理这些特殊情况以防运行期异常。
- 使用并行流 (`parallelStream`) 可能改变顺序以及增加复杂度,因此除非必要不建议轻易采用平行化操作[^2]。
阅读全文
相关推荐















