为什么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;
}