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


脚步:


调用名称为insertPhoneAndArea的方法
给定具有变量的相同数据,其中包含“ recordEntityList”,并且该数据不为空
当我执行该方法时,selfGroup为空,其大小为零。所以我对结果感到奇怪。它不应为空,因为recordEntityList不为空。
我使用IDEA打开了调试模式,并且正在使用Alt + LeftClick执行代码
结果是正确的,不是空的。
因此,按预期方式,我在组代码中编写了一个try计数,该循环中的代码大约是随机的,最多30个,这是正确的结果,并且不在while循环中。


我不知道错误是什么。

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

最佳答案

如果Map<String, List<RecordEntity>> selfGroup = recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum));selfGroup设置为空映射,则必须是因为recordEntityList为空。

为什么调用者为什么要向您的方法传递一个空列表,我显然不能告诉您。

PS:您不需要Yoda条件,0==selfGroup.size()。我建议selfGroup.isEmpty()

关于java - 为什么Java8 Stream GroupingBy返回空,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59747739/

10-11 09:26