Skip to content

Commit

Permalink
Add fromEntries on HashMap and LinkedHashMap
Browse files Browse the repository at this point in the history
Closes #34818

Change-Id: I77b117c16169a5c5bd5655e851256930a2ea5a28
Reviewed-on: https://dart-review.googlesource.com/c/81188
Commit-Queue: Nate Bosch <nbosch@google.com>
Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
  • Loading branch information
natebosch authored and commit-bot@chromium.org committed Oct 23, 2018
1 parent 4f2a4e6 commit 03eafc0
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ a InstanceTypeError if the instance isn't of the class expected
### Core library changes
* Add `HashMap.fromEntries` and `LinkedHashmap.fromEntries` constructors.
### Dart VM
### Tool Changes
Expand Down
12 changes: 12 additions & 0 deletions sdk/lib/collection/hash_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,16 @@ abstract class HashMap<K, V> implements Map<K, V> {
MapBase._fillMapWithIterables(map, keys, values);
return map;
}

/**
* Creates a [HashMap] containing the entries of [entries].
*
* Returns a new `HashMap<K, V>` where all entries of [entries]
* have been added in iteration order.
*
* If multiple [entries] have the same key,
* later occurrences overwrite the earlier ones.
*/
factory HashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
HashMap<K, V>()..addEntries(entries);
}
12 changes: 12 additions & 0 deletions sdk/lib/collection/linked_hash_map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,16 @@ abstract class LinkedHashMap<K, V> implements Map<K, V> {
MapBase._fillMapWithIterables(map, keys, values);
return map;
}

/**
* Creates a [LinkedHashMap] containing the entries of [entries].
*
* Returns a new `LinkedHashMap<K, V>` where all entries of [entries]
* have been added in iteration order.
*
* If multiple [entries] have the same key,
* later occurrences overwrite the earlier ones.
*/
factory LinkedHashMap.fromEntries(Iterable<MapEntry<K, V>> entries) =>
<K, V>{}..addEntries(entries);
}
7 changes: 5 additions & 2 deletions sdk/lib/core/map.dart
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,11 @@ abstract class Map<K, V> {
/**
* Creates a new map and adds all entries.
*
* Creates a new map like `new Map<K, V>()` and then adds the key
* and value of eacy entry in [entries] in iteration order.
* Returns a new `Map<K, V>` where all entries of [entries]
* have been added in iteration order.
*
* If multiple [entries] have the same key,
* later occurrences overwrite the earlier ones.
*/
factory Map.fromEntries(Iterable<MapEntry<K, V>> entries) =>
<K, V>{}..addEntries(entries);
Expand Down
47 changes: 47 additions & 0 deletions tests/corelib_2/map_from_entries_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:collection';

import 'package:expect/expect.dart';

main() {
runTests(<K, V>(entries) => Map<K, V>.fromEntries(entries));
runTests(<K, V>(entries) => HashMap<K, V>.fromEntries(entries));
runTests(<K, V>(entries) => LinkedHashMap<K, V>.fromEntries(entries));
}

void runTests(Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
fromEntriesTest(ctor);
emptyIterableTest(ctor);
equalElementsTest(ctor);
}

void fromEntriesTest(Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
var map = ctor([MapEntry(1, "one"), MapEntry(2, "two")]);
Expect.equals(2, map.length);
Expect.equals(2, map.keys.length);
Expect.equals(2, map.values.length);
Expect.equals("one", map[1]);
Expect.equals("two", map[2]);
}

void emptyIterableTest(
Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
var map = ctor([]);
Expect.equals(0, map.length);
Expect.equals(0, map.keys.length);
Expect.equals(0, map.values.length);
}

void equalElementsTest(
Map<K, V> Function<K, V>(Iterable<MapEntry<K, V>>) ctor) {
var map =
ctor([MapEntry(1, "one"), MapEntry(2, "two"), MapEntry(2, "other")]);
Expect.equals(2, map.length);
Expect.equals(2, map.keys.length);
Expect.equals(2, map.values.length);
Expect.equals("one", map[1]);
Expect.equals("other", map[2]);
}

0 comments on commit 03eafc0

Please sign in to comment.