我正在为注册屏幕创建一个非常简单的表单验证实用程序,并且我遇到了一些意外的行为LinkedHashMap和从它创建的流entrySet.
我将验证结果存储在a中LinkedHashMap,具有以下语句顺序:
Map 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 invalidFields = aggregateInvalidFields(fieldStatuses);
除了"确认密码"之外,一个特定的迭代产生上述所有字段无效.在条目集上使用简单的for循环并省略有效结果,无效结果按以下顺序显示:
电子邮件
用户名
生日
密码
然后我尝试使用Android上可用的Stream API子集(目标版本25,最小值为19,因此缺少Collectors.toMap()):
private static List aggregateInvalidFields(Map fields) {
List 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?的插入顺序?需要注意的是,如果我换出forEachOrdered用forEach,它仍然没有插入排序.