2024-08-07
一言
爱,其实很简单,困难的是去接受它。 --- 《通灵王》 · hitokoto
Java Map.getOrDefault
你可以通过直接在 vo.setA()
方法中进行 null
检查来实现这个功能。下面是一个示例,展示了如何在设置值时检查 map.get("A")
是否为 null
,如果是 null
则设置为 0
,否则设置为 map.get("A")
的值。
假设你的 VO 类名为 MyVO
,其 a
属性的设置方法是 setA
,代码如下:
import java.util.Map;
public class Main {
public static void main(String[] args) {
// 创建一个示例 VO 对象
MyVO vo = new MyVO();
// 创建一个示例 Map
Map<String, Integer> map = Map.of("A", 10, "B", 20);
// 通过 map.get("A") 判断是否为 null,如果为 null 则设置为 0,否则设置为 map.get("A") 的值
vo.setA(map.getOrDefault("A", 0));
// 输出 VO 的 a 属性值
System.out.println("VO a 属性的值: " + vo.getA());
}
}
class MyVO {
private int a;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
}
在这个示例中:
map.getOrDefault("A", 0)
方法会在map.get("A")
返回null
时返回默认值0
,否则返回map.get("A")
的值。vo.setA(map.getOrDefault("A", 0))
通过这个方法直接设置a
属性。
这样,你就可以在设置值时检查 map.get("A")
是否为 null
,并根据结果设置相应的值。
Java list to map
要将 count
和 exp
放入另一个类 Fin
中,并在 MyVO
类中增加一个 List<Fin>
字段,然后计算每个状态下所有 Fin
对象的 count
和 exp
的总和,可以按如下方式操作。
定义 Fin
类和修改后的 MyVO
类:
import java.math.BigDecimal;
import java.util.List;
class Fin {
private BigDecimal count;
private BigDecimal exp;
// Constructors, getters, and setters
public Fin(BigDecimal count, BigDecimal exp) {
this.count = count;
this.exp = exp;
}
public BigDecimal getCount() {
return count;
}
public void setCount(BigDecimal count) {
this.count = count;
}
public BigDecimal getExp() {
return exp;
}
public void setExp(BigDecimal exp) {
this.exp = exp;
}
}
enum Status {
PLAN,
IN,
COM
}
class MyVO {
private String name;
private Status status;
private List<Fin> fins;
// Constructors, getters, and setters
public MyVO(String name, Status status, List<Fin> fins) {
this.name = name;
this.status = status;
this.fins = fins;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public List<Fin> getFins() {
return fins;
}
public void setFins(List<Fin> fins) {
this.fins = fins;
}
}
将 List<MyVO>
转换为 Map<Status, BigDecimal>
并计算所有 Fin
对象的 count
和 exp
的总和:
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 创建示例 Fin 对象列表
List<Fin> fins1 = Arrays.asList(
new Fin(new BigDecimal("10"), new BigDecimal("5")),
new Fin(new BigDecimal("20"), new BigDecimal("10"))
);
List<Fin> fins2 = Arrays.asList(
new Fin(new BigDecimal("15"), new BigDecimal("7")),
new Fin(new BigDecimal("25"), new BigDecimal("12"))
);
List<Fin> fins3 = Arrays.asList(
new Fin(new BigDecimal("30"), new BigDecimal("15"))
);
// 创建示例 VO 对象列表
List<MyVO> list = Arrays.asList(
new MyVO("A", Status.PLAN, fins1),
new MyVO("B", Status.IN, fins2),
new MyVO("C", Status.PLAN, fins3)
);
// 将 List<MyVO> 转换为 Map<Status, BigDecimal>,并计算所有 Fin 对象的 count 和 exp 的总和
Map<Status, BigDecimal> statusSumMap = list.stream()
.collect(Collectors.groupingBy(
MyVO::getStatus, // 分组依据
Collectors.reducing(
BigDecimal.ZERO,
vo -> vo.getFins().stream()
.map(fin -> fin.getCount().add(fin.getExp()))
.reduce(BigDecimal.ZERO, BigDecimal::add), // 计算 count 和 exp 的总和
BigDecimal::add // 合并同一状态的结果
)
));
// 打印结果
statusSumMap.forEach((status, totalSum) -> System.out.println("Status: " + status + ", Total Sum: " + totalSum));
}
}
在这个示例中:
list.stream()
将列表转换为流。collect(Collectors.groupingBy(...))
将流收集到一个Map
中:MyVO::getStatus
用于根据status
进行分组。Collectors.reducing(...)
用于对每个MyVO
对象的fins
列表中的count
和exp
进行求和,并将同一状态的结果进行合并。
完整示例代码:
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
class Fin {
private BigDecimal count;
private BigDecimal exp;
// Constructors, getters, and setters
public Fin(BigDecimal count, BigDecimal exp) {
this.count = count;
this.exp = exp;
}
public BigDecimal getCount() {
return count;
}
public void setCount(BigDecimal count) {
this.count = count;
}
public BigDecimal getExp() {
return exp;
}
public void setExp(BigDecimal exp) {
this.exp = exp;
}
}
enum Status {
PLAN,
IN,
COM
}
class MyVO {
private String name;
private Status status;
private List<Fin> fins;
// Constructors, getters, and setters
public MyVO(String name, Status status, List<Fin> fins) {
this.name = name;
this.status = status;
this.fins = fins;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public List<Fin> getFins() {
return fins;
}
public void setFins(List<Fin> fins) {
this.fins = fins;
}
}
public class Main {
public static void main(String[] args) {
// 创建示例 Fin 对象列表
List<Fin> fins1 = Arrays.asList(
new Fin(new BigDecimal("10"), new BigDecimal("5")),
new Fin(new BigDecimal("20"), new BigDecimal("10"))
);
List<Fin> fins2 = Arrays.asList(
new Fin(new BigDecimal("15"), new BigDecimal("7")),
new Fin(new BigDecimal("25"), new BigDecimal("12"))
);
List<Fin> fins3 = Arrays.asList(
new Fin(new BigDecimal("30"), new BigDecimal("15"))
);
// 创建示例 VO 对象列表
List<MyVO> list = Arrays.asList(
new MyVO("A", Status.PLAN, fins1),
new MyVO("B", Status.IN, fins2),
new MyVO("C", Status.PLAN, fins3)
);
// 将 List<MyVO> 转换为 Map<Status, BigDecimal>,并计算所有 Fin 对象的 count 和 exp 的总和
Map<Status, BigDecimal> statusSumMap = list.stream()
.collect(Collectors.groupingBy(
MyVO::getStatus, // 分组依据
Collectors.reducing(
BigDecimal.ZERO,
vo -> vo.getFins().stream()
.map(fin -> fin.getCount().add(fin.getExp()))
.reduce(BigDecimal.ZERO, BigDecimal::add), // 计算 count 和 exp 的总和
BigDecimal::add // 合并同一状态的结果
)
));
// 打印结果
statusSumMap.forEach((status, totalSum) -> System.out.println("Status: " + status + ", Total Sum: " + totalSum));
}
}
这段代码展示了如何将 List<MyVO>
转换为 Map<Status, BigDecimal>
,并计算每个状态下所有 Fin
对象的 count
和 exp
的总和。