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