跳到主要内容

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;
}
}

在这个示例中:

  1. map.getOrDefault("A", 0) 方法会在 map.get("A") 返回 null 时返回默认值 0,否则返回 map.get("A") 的值。
  2. vo.setA(map.getOrDefault("A", 0)) 通过这个方法直接设置 a 属性。

这样,你就可以在设置值时检查 map.get("A") 是否为 null,并根据结果设置相应的值。

Java list to map

要将 countexp 放入另一个类 Fin 中,并在 MyVO 类中增加一个 List<Fin> 字段,然后计算每个状态下所有 Fin 对象的 countexp 的总和,可以按如下方式操作。

定义 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 对象的 countexp 的总和:

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));
}
}

在这个示例中:

  1. list.stream() 将列表转换为流。
  2. collect(Collectors.groupingBy(...)) 将流收集到一个 Map 中:
    • MyVO::getStatus 用于根据 status 进行分组。
    • Collectors.reducing(...) 用于对每个 MyVO 对象的 fins 列表中的 countexp 进行求和,并将同一状态的结果进行合并。

完整示例代码:

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