[英]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.