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 的总和。