[英]LinkedHashMap entrySet's order not being preserved in a stream (Android)
我正在为注册屏幕创建一个非常简单的表单验证实用程序,我遇到了一些关于LinkedHashMap
和从其entrySet
创建的流的意外行为。
我将验证结果存储在LinkedHashMap
,具有以下语句顺序:
Map<ValidationResult.SignUpField, Boolean> fieldStatuses = new LinkedHashMap<>();
fieldStatuses.put(EMAIL, isValidEmail(emailAddress));
fieldStatuses.put(USERNAME, isValidUsername(username));
fieldStatuses.put(BIRTHDAY, isValidBirthday(birthday));
fieldStatuses.put(PASSWORD, isValidPassword(password));
fieldStatuses.put(CONFIRM_PASSWORD, password.equals(confirmedPassword));
List<ValidationEntry> invalidFields = aggregateInvalidFields(fieldStatuses);
除了“确认密码”之外,一个特定的迭代产生上述所有字段无效。 在条目集上使用简单的for循环并省略有效结果,无效结果按以下顺序显示:
然后我尝试使用Android上可用的Stream API子集(目标版本25,最小值为19,因此缺少Collectors.toMap()
):
private static List<ValidationEntry> aggregateInvalidFields(Map<ValidationResult.SignUpField, Boolean> fields) {
List<ValidationEntry> invalidFields = new ArrayList<>();
fields.entrySet()
.stream()
.filter(entry -> !entry.getValue())
.forEachOrdered(entry -> {
ValidationResult.SignUpField field = entry.getKey();
invalidFields.add(new ValidationEntry(field, lookUpErrorCode(field)));
});
return invalidFields;
}
但该代码产生以下顺序:
这里究竟发生了什么,为什么流的结果不符合LinkedHashMap
的插入顺序? 请注意,如果我用forEach
换出forEachOrdered
,它仍然没有按顺序插入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.