Почему Java8 Stream GroupingBy возвращает пустой

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

Шаги:

  1. Вызов метода с именем insertPhoneAndArea
  2. Учитывая те же данные с переменными, с "recordEntityList" там, и он не был пустым
  3. Когда я выполнил этот метод, группа selfGroup была пустой и имела нулевой размер. Так что я чувствую себя странно с результатом. Он не должен быть пустым, потому что recordEntityList не было пустым.
  4. Я включил режим отладки с IDEA, и я использовал Alt+LeftClick для выполнения кода, и результат был правильным, он не был пустым.
  5. Итак, я написал счетчик попыток в групповом коде, как и ожидалось, этот код в цикле был примерно случайным до 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;
}

2 ответа

Если Map<String, List<RecordEntity>> selfGroup = recordEntityList.stream().collect(Collectors.groupingBy(RecordEntity::getSelfNum)); наборы selfGroup к пустой карте, это должно быть потому, что recordEntityList пусто.

Я, очевидно, не могу сказать, почему вызывающий передает пустой список в ваш метод.

PS Не нужно условие Йоды, 0==selfGroup.size(). Я бы рекомендовалselfGroup.isEmpty().

Есть ли шанс, что selfNum равен нулю? вы не можете группировать по нулю, на самом деле вы получите исключение. если нет, попробуйте использовать фразу в другом языке.

Другие вопросы по тегам