为什么Java8流GroupingBy返回空
如果为什么Java8流GroupingBy返回空,java,spring-boot,lambda,java-stream,scntranscaction,Java,Spring Boot,Lambda,Java Stream,Scntranscaction,如果Map selfGroup=recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum))将selfGroup设置为空映射,这必须是因为recordEntityList为空 显然,我不知道为什么调用方将空列表传递给您的方法 PS您不需要Yoda条件,0==selfGroup.size()。如果Map selfGroup=recordEntityList.stream().collect(Co
Map selfGroup=recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum))
将selfGroup
设置为空映射,这必须是因为recordEntityList
为空
显然,我不知道为什么调用方将空列表传递给您的方法
PS您不需要Yoda条件,0==selfGroup.size()
。如果Map selfGroup=recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum)),我建议使用selfGroup.isEmpty()
将selfGroup
设置为空映射,这必须是因为recordEntityList
为空
显然,我不知道为什么调用方将空列表传递给您的方法
PS您不需要Yoda条件,0==selfGroup.size()
。我建议您使用selfGroup.isEmpty()
selfNum是否为空?你不能按null分组,实际上,你会得到一个异常。
如果没有,请尝试在其他语言环境中使用短语。selfNum是否有可能为null?你不能按null分组,实际上,你会得到一个异常。
如果没有,请尝试在其他语言环境中使用短语。请回答您的问题并添加
RecordEntity
的定义,尤其是getSelfNum
方法。如果它返回一个非标准类型,该类型的定义以及它们所依赖的一切(字段、填充字段的方法等)。简而言之,创建一个。recordEntityList的类型是什么?有可能同时修改吗?@Holger你认为同时修改会导致从非空列表中获得一张空地图的20000次吗?@OleV.V。它可以解释任意次数。目前,我们甚至不知道并发变化的方向,如果有,(空)→ 非空,或非空→ 空,或只是产生不一致的状态)。我也在考虑,这将解释为什么每次检查列表都会使问题消失。请回答您的问题并添加RecordEntity
的定义,特别是getSelfNum
方法。如果它返回一个非标准类型,该类型的定义以及它们所依赖的一切(字段、填充字段的方法等)。简而言之,创建一个。recordEntityList的类型是什么?有可能同时修改吗?@Holger你认为同时修改会导致从非空列表中获得一张空地图的20000次吗?@OleV.V。它可以解释任意次数。目前,我们甚至不知道并发变化的方向,如果有,(空)→ 非空,或非空→ 空,或只是产生不一致的状态)。我还考虑了,这可以解释为什么每次检查列表都会解决问题。对于后者,您是正确的:如果getSelfNum()
返回null
,您将得到java.lang.NullPointerException:元素不能映射到null键
。问题中的代码中显然没有出现这种情况,因为它重复了20000次。感谢您的回答,当方法执行具有空selfGroup的方法时,方法调用方不会给出空列表,这就是selfNum从不具有null,但是在关于try的循环中,结果是正确的,例如:16计算出循环。对于后者,您是正确的:如果getSelfNum()
返回null
,您将得到java.lang.NullPointerException:元素不能映射到null键
。问题中的代码中显然没有出现这种情况,因为它重复了20000次。感谢您的回答,当方法执行具有空selfGroup的方法时,方法调用方不会给出空列表,这就是selfNum从不具有null,但是在关于try的循环中,结果是正确的。例如:16个计数将退出循环。感谢您的建议,但是调用方没有在错误出现时向方法提供空列表。感谢您的反馈。我不太确定。在任何情况下,如果我们要进一步调查,我们将需要您。感谢您的建议,但调用方不会在错误出现时向方法提供空列表。感谢您的反馈。我不太确定。无论如何,如果我们要进一步调查,我们需要你。
@Transactional(isolation = Isolation.READ_UNCOMMITTED
, propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void insertPhoneAndArea(List<RecordEntity> recordEntityList) {
int tryCount = 0;
OffsetTime startTime = OffsetTime.ofInstant(Instant.now(), ZoneId.systemDefault());
Map<String, List<RecordEntity>> selfGroup = recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum));
while (0==selfGroup.size()) {
//There has a bug with Jdk Stream to groupBy in One elements ,So have a loop try
selfGroup = recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum));
tryCount++;
if (tryCount > 20000) {
break;
}
log.info("try to get SelfNum with Stream bug ! count in {} ",tryCount);
}
}
@Data
public class RecordEntity {
private int id;
/**
* 通话时间
*/
private Date recordTime;
/**
* 持续时长
*/
private Integer duration;
/**
* 通话方式/ 1电话主叫、2电话被叫、3短信主叫、4短信被叫
*/
private Integer recordMode;
/**
* 对方电话号码
*/
private String dialNum;
/**
* 通话地点
*/
private String recordAddress;
/**
* 通话类型/ 1本地、2异地
*/
private Integer recordType;
/**
* 小区编号
*/
private String area;
/**
* 基站号
*/
private String baseStation;
/**
* 交换机号
*/
private String exchange;
/**
* 本机号码
*/
private String selfNum;
/**
* 机主姓名
*/
private String username;
/**
* 机主身份证
*/
private String idNum;
/**
* 通话记录id(唯一)
*/
private String recordId;
/**
* 话单运营商
*/
private Integer operator;
/**
* 对方号码类型(1-手机,2-固话,3-服务号)
*/
private Integer dialNumType;
}