一、流
java
List<TivsmInstInfo> tivsmInstInfoList = tivsmInstInfoService.list() // 1. 获取所有数据
.stream() // 2. 转为流
.filter(info -> // 3. 过滤条件
new BigDecimal("5").compareTo(info.getInstStat()) == 0 // 使用 compareTo 正确比较
)
.collect(Collectors.toList()); // 4. 收集为List
1. 获取数据源:tivsmInstInfoService.list()
返回值 :通常返回一个 List<TivsmInstInfo>
类型的集合,我们称之为数据源 或流的起点。假设这个列表包含N个对象。
2. 创建流:.stream()
作用 :将上一步得到的 List<TivsmInstInfo>
集合转换为一个 Stream<TivsmInstInfo>
(流)。
3. 过滤数据:.filter(...)
//原来的代码
.filter(TivsmInstInfo -> TivsmInstInfo.getInstStat() == new BigDecimal(5))
-
参数:Lambda表达式
TivsmInstInfo -> TivsmInstInfo.getInstStat() == new BigDecimal(5)
-
TivsmInstInfo
:是流中每个元素的代表(你可以任意命名,如item
,info
)。 -
->
:箭头符号,将参数列表和表达式主体分开。 -
TivsmInstInfo.getInstStat() == new BigDecimal(5)
:这是过滤的条件。-
它获取每个
TivsmInstInfo
对象的instStat
属性(其类型显然是BigDecimal
)。 -
然后判断它是否等于 新创建的
BigDecimal(5)
。
-
-
这是最核心的筛选步骤。
⚠️ 重要问题:这里的写法有一个潜在的Bug!
使用 ==
比较 BigDecimal
是错误 的。==
比较的是对象的内存地址 ,而不是它们的数值 。两个内容都是5的 BigDecimal
对象,如果用 ==
比较,可能会返回 false
。
正确写法应使用 equals()
或 compareTo()
:
.filter(info -> info.getInstStat().compareTo(new BigDecimal(5)) == 0)
// 或者
.filter(info -> new BigDecimal(5).equals(info.getInstStat()))
4. 收集结果:.collect(Collectors.toList())
作用 :这是一个终止操作 。它负责将经过前面过滤操作后的 Stream<TivsmInstInfo>
收集 起来,转换回我们熟悉的 List<TivsmInstInfo>
集合。
二、JSON和JSONObject区别
JSON 类(工具类)
JSON
是一个静态工具类,主要用于转换操作:
1. JSON.parseArray() - 将JSON字符串转换为List
// 将JSON数组字符串转换为对象列表
List<InstInfoVO> payload = JSON.parseArray(
exchange.getBody().getPayload().toJSONString(), // JSON字符串
InstInfoVO.class // 目标类类型
);
2. JSON.parseObject() - 将JSON字符串转换为对象
// 将JSON字符串转换为单个对象
InstInfoVO info = JSON.parseObject(jsonString, InstInfoVO.class);
// 或者转换为JSONObject
JSONObject jsonObject = JSON.parseObject(jsonString);
3. JSON.toJSONString() - 将对象转换为JSON字符串
// 将对象转换为JSON字符串
String jsonStr = JSON.toJSONString(object);
// 带格式化
String prettyJson = JSON.toJSONString(object, SerializerFeature.PrettyFormat);
JSONObject 类(对象类)
JSONObject
是一个可以操作的具体对象,继承自 HashMap<String, Object>
:
1. 创建和操作JSONObject
// 创建JSONObject
JSONObject jsonObj = new JSONObject();
// 添加属性
jsonObj.put("name", "张三");
jsonObj.put("age", 25);
jsonObj.put("isStudent", false);
// 获取属性
String name = jsonObj.getString("name");
int age = jsonObj.getInteger("age");
2. 转换为字符串
// 转换为JSON字符串
String jsonString = jsonObj.toJSONString();
// 在您的代码中
log.info("发送账户余额消息,入参:{}", JSONObject.toJSONString(paramMap));
// 这里其实应该用 JSON.toJSONString(paramMap),但JSONObject.toJSONString()也可以
代码解释
List<InstInfoVO> payload = JSON.parseArray(
exchange.getBody().getPayload().toJSONString(), // 1. 先将payload转为JSON字符串
InstInfoVO.class // 2. 再解析为InstInfoVO列表
);
log.info("发送账户余额消息,入参:{}",
JSONObject.toJSONString(paramMap) // 将Map转换为JSON字符串用于日志输出
);
常用方法对比
操作 | JSON (工具类) | JSONObject (对象) |
---|---|---|
字符串→对象 | parseObject() |
parseObject() |
字符串→列表 | parseArray() |
不支持 |
对象→字符串 | toJSONString() |
toJSONString() |
操作属性 | 不支持 | put() , get() |