diff --git a/analysis_options.yaml b/analysis_options.yaml
index d8300ef..c5a2a27 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,3 +1,4 @@
+include: package:pedantic/analysis_options.yaml
 analyzer:
   errors:
     unused_element: error
@@ -30,7 +31,11 @@
     - library_prefixes
     - non_constant_identifier_names
     - only_throw_errors
+    - prefer_equal_for_default_values
     - prefer_final_fields
+    - prefer_generic_function_type_aliases
     - prefer_is_not_empty
     - slash_for_doc_comments
     - type_init_formals
+    - unnecessary_const
+    - unnecessary_new
diff --git a/lib/src/algorithms.dart b/lib/src/algorithms.dart
index 0d37d64..9a9e371 100644
--- a/lib/src/algorithms.dart
+++ b/lib/src/algorithms.dart
@@ -65,7 +65,7 @@
 ///
 /// A sub-range of a list can be shuffled by providing [start] and [end].
 void shuffle(List list, [int start = 0, int end]) {
-  var random = new math.Random();
+  var random = math.Random();
   if (end == null) end = list.length;
   int length = end - start;
   while (length > 1) {
@@ -108,7 +108,7 @@
 /// This insertion sort is stable: Equal elements end up in the same order
 /// as they started in.
 void insertionSort<T>(List<T> list,
-    {int compare(T a, T b), int start: 0, int end}) {
+    {int compare(T a, T b), int start = 0, int end}) {
   // If the same method could have both positional and named optional
   // parameters, this should be (list, [start, end], {compare}).
   compare ??= defaultCompare<T>();
@@ -151,7 +151,7 @@
 /// This merge sort is stable: Equal elements end up in the same order
 /// as they started in.
 void mergeSort<T>(List<T> list,
-    {int start: 0, int end, int compare(T a, T b)}) {
+    {int start = 0, int end, int compare(T a, T b)}) {
   end ??= list.length;
   compare ??= defaultCompare<T>();
 
@@ -171,7 +171,7 @@
   int firstLength = middle - start;
   int secondLength = end - middle;
   // secondLength is always the same as firstLength, or one greater.
-  var scratchSpace = new List<T>(secondLength);
+  var scratchSpace = List<T>(secondLength);
   _mergeSort(list, compare, middle, end, scratchSpace, 0);
   int firstTarget = end - firstLength;
   _mergeSort(list, compare, start, middle, list, firstTarget);
diff --git a/lib/src/canonicalized_map.dart b/lib/src/canonicalized_map.dart
index 9e1d5cf..80324b2 100644
--- a/lib/src/canonicalized_map.dart
+++ b/lib/src/canonicalized_map.dart
@@ -6,9 +6,9 @@
 
 import 'utils.dart';
 
-typedef C _Canonicalize<C, K>(K key);
+typedef _Canonicalize<C, K> = C Function(K key);
 
-typedef bool _IsValidKey(Object key);
+typedef _IsValidKey = bool Function(Object key);
 
 /// A map whose keys are converted to canonical values of type `C`.
 ///
@@ -24,7 +24,7 @@
 
   final _IsValidKey _isValidKeyFn;
 
-  final _base = new Map<C, Pair<K, V>>();
+  final _base = Map<C, Pair<K, V>>();
 
   /// Creates an empty canonicalized map.
   ///
@@ -62,16 +62,15 @@
 
   void operator []=(K key, V value) {
     if (!_isValidKey(key)) return;
-    _base[_canonicalize(key)] = new Pair(key, value);
+    _base[_canonicalize(key)] = Pair(key, value);
   }
 
   void addAll(Map<K, V> other) {
     other.forEach((key, value) => this[key] = value);
   }
 
-  void addEntries(Iterable<MapEntry<K, V>> entries) =>
-      _base.addEntries(entries.map(
-          (e) => new MapEntry(_canonicalize(e.key), new Pair(e.key, e.value))));
+  void addEntries(Iterable<MapEntry<K, V>> entries) => _base.addEntries(
+      entries.map((e) => MapEntry(_canonicalize(e.key), Pair(e.key, e.value))));
 
   Map<K2, V2> cast<K2, V2>() => _base.cast<K2, V2>();
 
@@ -88,7 +87,7 @@
       _base.values.any((pair) => pair.last == value);
 
   Iterable<MapEntry<K, V>> get entries =>
-      _base.entries.map((e) => new MapEntry(e.value.first, e.value.last));
+      _base.entries.map((e) => MapEntry(e.value.first, e.value.last));
 
   void forEach(void f(K key, V value)) {
     _base.forEach((key, pair) => f(pair.first, pair.last));
@@ -107,7 +106,7 @@
 
   V putIfAbsent(K key, V ifAbsent()) {
     return _base
-        .putIfAbsent(_canonicalize(key), () => new Pair(key, ifAbsent()))
+        .putIfAbsent(_canonicalize(key), () => Pair(key, ifAbsent()))
         .last;
   }
 
@@ -124,12 +123,12 @@
   Map<K2, V2> retype<K2, V2>() => cast<K2, V2>();
 
   V update(K key, V update(V value), {V ifAbsent()}) => _base
-      .update(_canonicalize(key), (pair) => new Pair(key, update(pair.last)),
-          ifAbsent: ifAbsent == null ? null : () => new Pair(key, ifAbsent()))
+      .update(_canonicalize(key), (pair) => Pair(key, update(pair.last)),
+          ifAbsent: ifAbsent == null ? null : () => Pair(key, ifAbsent()))
       .last;
 
-  void updateAll(V update(K key, V value)) => _base.updateAll(
-      (_, pair) => new Pair(pair.first, update(pair.first, pair.last)));
+  void updateAll(V update(K key, V value)) => _base
+      .updateAll((_, pair) => Pair(pair.first, update(pair.first, pair.last)));
 
   Iterable<V> get values => _base.values.map((pair) => pair.last);
 
@@ -139,7 +138,7 @@
       return '{...}';
     }
 
-    var result = new StringBuffer();
+    var result = StringBuffer();
     try {
       _toStringVisiting.add(this);
       result.write('{');
diff --git a/lib/src/combined_wrappers/combined_iterable.dart b/lib/src/combined_wrappers/combined_iterable.dart
index 511876e..3df5e82 100644
--- a/lib/src/combined_wrappers/combined_iterable.dart
+++ b/lib/src/combined_wrappers/combined_iterable.dart
@@ -19,7 +19,7 @@
   const CombinedIterableView(this._iterables);
 
   Iterator<T> get iterator =>
-      new _CombinedIterator<T>(_iterables.map((i) => i.iterator).iterator);
+      _CombinedIterator<T>(_iterables.map((i) => i.iterator).iterator);
 
   // Special cased contains/isEmpty/length since many iterables have an
   // efficient implementation instead of running through the entire iterator.
diff --git a/lib/src/combined_wrappers/combined_list.dart b/lib/src/combined_wrappers/combined_list.dart
index 21a68f6..593490e 100644
--- a/lib/src/combined_wrappers/combined_list.dart
+++ b/lib/src/combined_wrappers/combined_list.dart
@@ -16,7 +16,7 @@
 class CombinedListView<T> extends ListBase<T>
     implements UnmodifiableListView<T> {
   static void _throw() {
-    throw new UnsupportedError('Cannot modify an unmodifiable List');
+    throw UnsupportedError('Cannot modify an unmodifiable List');
   }
 
   /// The lists that this combines.
@@ -40,7 +40,7 @@
       }
       index -= list.length;
     }
-    throw new RangeError.index(initialIndex, this, 'index', null, length);
+    throw RangeError.index(initialIndex, this, 'index', null, length);
   }
 
   void operator []=(int index, T value) {
diff --git a/lib/src/combined_wrappers/combined_map.dart b/lib/src/combined_wrappers/combined_map.dart
index 8c2760b..aa86b5d 100644
--- a/lib/src/combined_wrappers/combined_map.dart
+++ b/lib/src/combined_wrappers/combined_map.dart
@@ -48,5 +48,5 @@
   /// Unlike most [Map] implementations, modifying an individual map while
   /// iterating the keys will _sometimes_ throw. This behavior may change in
   /// the future.
-  Iterable<K> get keys => new CombinedIterableView<K>(_maps.map((m) => m.keys));
+  Iterable<K> get keys => CombinedIterableView<K>(_maps.map((m) => m.keys));
 }
diff --git a/lib/src/empty_unmodifiable_set.dart b/lib/src/empty_unmodifiable_set.dart
index 997619d..2c9ed30 100644
--- a/lib/src/empty_unmodifiable_set.dart
+++ b/lib/src/empty_unmodifiable_set.dart
@@ -12,27 +12,27 @@
 class EmptyUnmodifiableSet<E> extends IterableBase<E>
     implements UnmodifiableSetView<E> {
   static T _throw<T>() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Set");
+    throw UnsupportedError("Cannot modify an unmodifiable Set");
   }
 
-  Iterator<E> get iterator => new Iterable<E>.empty().iterator;
+  Iterator<E> get iterator => Iterable<E>.empty().iterator;
   int get length => 0;
 
   const EmptyUnmodifiableSet();
 
-  EmptyUnmodifiableSet<T> cast<T>() => new EmptyUnmodifiableSet<T>();
+  EmptyUnmodifiableSet<T> cast<T>() => EmptyUnmodifiableSet<T>();
   bool contains(Object element) => false;
   bool containsAll(Iterable<Object> other) => other.isEmpty;
-  Iterable<E> followedBy(Iterable<E> other) => new Set.from(other);
+  Iterable<E> followedBy(Iterable<E> other) => Set.from(other);
   E lookup(Object element) => null;
   @deprecated
-  EmptyUnmodifiableSet<T> retype<T>() => new EmptyUnmodifiableSet<T>();
+  EmptyUnmodifiableSet<T> retype<T>() => EmptyUnmodifiableSet<T>();
   E singleWhere(bool test(E element), {E orElse()}) => super.singleWhere(test);
-  Iterable<T> whereType<T>() => new EmptyUnmodifiableSet<T>();
-  Set<E> toSet() => new Set();
-  Set<E> union(Set<E> other) => new Set.from(other);
-  Set<E> intersection(Set<Object> other) => new Set();
-  Set<E> difference(Set<Object> other) => new Set();
+  Iterable<T> whereType<T>() => EmptyUnmodifiableSet<T>();
+  Set<E> toSet() => Set();
+  Set<E> union(Set<E> other) => Set.from(other);
+  Set<E> intersection(Set<Object> other) => Set();
+  Set<E> difference(Set<Object> other) => Set();
 
   bool add(E value) => _throw();
   void addAll(Iterable<E> elements) => _throw();
diff --git a/lib/src/equality.dart b/lib/src/equality.dart
index 855503e..5f4038a 100644
--- a/lib/src/equality.dart
+++ b/lib/src/equality.dart
@@ -30,7 +30,7 @@
   bool isValidKey(Object o);
 }
 
-typedef F _GetKey<E, F>(E object);
+typedef _GetKey<E, F> = F Function(E object);
 
 /// Equality of objects based on derived values.
 ///
@@ -197,7 +197,7 @@
   bool equals(T elements1, T elements2) {
     if (identical(elements1, elements2)) return true;
     if (elements1 == null || elements2 == null) return false;
-    HashMap<E, int> counts = new HashMap(
+    HashMap<E, int> counts = HashMap(
         equals: _elementEquality.equals,
         hashCode: _elementEquality.hash,
         isValidKey: _elementEquality.isValidKey);
@@ -296,8 +296,8 @@
   final Equality<K> _keyEquality;
   final Equality<V> _valueEquality;
   const MapEquality(
-      {Equality<K> keys: const DefaultEquality(),
-      Equality<V> values: const DefaultEquality()})
+      {Equality<K> keys = const DefaultEquality(),
+      Equality<V> values = const DefaultEquality()})
       : _keyEquality = keys,
         _valueEquality = values;
 
@@ -306,15 +306,15 @@
     if (map1 == null || map2 == null) return false;
     int length = map1.length;
     if (length != map2.length) return false;
-    Map<_MapEntry, int> equalElementCounts = new HashMap();
+    Map<_MapEntry, int> equalElementCounts = HashMap();
     for (K key in map1.keys) {
-      _MapEntry entry = new _MapEntry(this, key, map1[key]);
+      _MapEntry entry = _MapEntry(this, key, map1[key]);
       int count = equalElementCounts[entry];
       if (count == null) count = 0;
       equalElementCounts[entry] = count + 1;
     }
     for (K key in map2.keys) {
-      _MapEntry entry = new _MapEntry(this, key, map2[key]);
+      _MapEntry entry = _MapEntry(this, key, map2[key]);
       int count = equalElementCounts[entry];
       if (count == null || count == 0) return false;
       equalElementCounts[entry] = count - 1;
@@ -413,35 +413,33 @@
 
   bool equals(e1, e2) {
     if (e1 is Set) {
-      return e2 is Set && new SetEquality(this).equals(e1, e2);
+      return e2 is Set && SetEquality(this).equals(e1, e2);
     }
     if (e1 is Map) {
-      return e2 is Map &&
-          new MapEquality(keys: this, values: this).equals(e1, e2);
+      return e2 is Map && MapEquality(keys: this, values: this).equals(e1, e2);
     }
     if (!_unordered) {
       if (e1 is List) {
-        return e2 is List && new ListEquality(this).equals(e1, e2);
+        return e2 is List && ListEquality(this).equals(e1, e2);
       }
       if (e1 is Iterable) {
-        return e2 is Iterable && new IterableEquality(this).equals(e1, e2);
+        return e2 is Iterable && IterableEquality(this).equals(e1, e2);
       }
     } else if (e1 is Iterable) {
       if (e1 is List != e2 is List) return false;
-      return e2 is Iterable &&
-          new UnorderedIterableEquality(this).equals(e1, e2);
+      return e2 is Iterable && UnorderedIterableEquality(this).equals(e1, e2);
     }
     return _base.equals(e1, e2);
   }
 
   int hash(Object o) {
-    if (o is Set) return new SetEquality(this).hash(o);
-    if (o is Map) return new MapEquality(keys: this, values: this).hash(o);
+    if (o is Set) return SetEquality(this).hash(o);
+    if (o is Map) return MapEquality(keys: this, values: this).hash(o);
     if (!_unordered) {
-      if (o is List) return new ListEquality(this).hash(o);
-      if (o is Iterable) return new IterableEquality(this).hash(o);
+      if (o is List) return ListEquality(this).hash(o);
+      if (o is Iterable) return IterableEquality(this).hash(o);
     } else if (o is Iterable) {
-      return new UnorderedIterableEquality(this).hash(o);
+      return UnorderedIterableEquality(this).hash(o);
     }
     return _base.hash(o);
   }
diff --git a/lib/src/equality_map.dart b/lib/src/equality_map.dart
index 14f074c..542977f 100644
--- a/lib/src/equality_map.dart
+++ b/lib/src/equality_map.dart
@@ -11,7 +11,7 @@
 class EqualityMap<K, V> extends DelegatingMap<K, V> {
   /// Creates a map with equality based on [equality].
   EqualityMap(Equality<K> equality)
-      : super(new LinkedHashMap(
+      : super(LinkedHashMap(
             equals: equality.equals,
             hashCode: equality.hash,
             isValidKey: equality.isValidKey));
@@ -22,7 +22,7 @@
   /// If [other] has multiple keys that are equivalent according to [equality],
   /// the last one reached during iteration takes precedence.
   EqualityMap.from(Equality<K> equality, Map<K, V> other)
-      : super(new LinkedHashMap(
+      : super(LinkedHashMap(
             equals: equality.equals,
             hashCode: equality.hash,
             isValidKey: equality.isValidKey)) {
diff --git a/lib/src/equality_set.dart b/lib/src/equality_set.dart
index f4abec6..8edbba5 100644
--- a/lib/src/equality_set.dart
+++ b/lib/src/equality_set.dart
@@ -11,7 +11,7 @@
 class EqualitySet<E> extends DelegatingSet<E> {
   /// Creates a set with equality based on [equality].
   EqualitySet(Equality<E> equality)
-      : super(new LinkedHashSet(
+      : super(LinkedHashSet(
             equals: equality.equals,
             hashCode: equality.hash,
             isValidKey: equality.isValidKey));
@@ -22,7 +22,7 @@
   /// If [other] has multiple values that are equivalent according to
   /// [equality], the first one reached during iteration takes precedence.
   EqualitySet.from(Equality<E> equality, Iterable<E> other)
-      : super(new LinkedHashSet(
+      : super(LinkedHashSet(
             equals: equality.equals,
             hashCode: equality.hash,
             isValidKey: equality.isValidKey)) {
diff --git a/lib/src/functions.dart b/lib/src/functions.dart
index b4ff9a9..83e0493 100644
--- a/lib/src/functions.dart
+++ b/lib/src/functions.dart
@@ -32,7 +32,7 @@
 /// values. If [value] is omitted, the value from [map2] is used.
 Map<K, V> mergeMaps<K, V>(Map<K, V> map1, Map<K, V> map2,
     {V value(V value1, V value2)}) {
-  var result = new Map<K, V>.from(map1);
+  var result = Map<K, V>.from(map1);
   if (value == null) return result..addAll(map2);
 
   map2.forEach((key, mapValue) {
@@ -118,7 +118,7 @@
   // [Warshall's algorithm]: https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm#Applications_and_generalizations.
   var result = <T, Set<T>>{};
   graph.forEach((vertex, edges) {
-    result[vertex] = new Set<T>.from(edges);
+    result[vertex] = Set<T>.from(edges);
   });
 
   // Lists are faster to iterate than maps, so we create a list since we're
@@ -160,9 +160,9 @@
 
   // The order of these doesn't matter, so we use un-linked implementations to
   // avoid unnecessary overhead.
-  var indices = new HashMap<T, int>();
-  var lowLinks = new HashMap<T, int>();
-  var onStack = new HashSet<T>();
+  var indices = HashMap<T, int>();
+  var lowLinks = HashMap<T, int>();
+  var onStack = HashSet<T>();
 
   strongConnect(T vertex) {
     indices[vertex] = index;
@@ -182,7 +182,7 @@
     }
 
     if (lowLinks[vertex] == indices[vertex]) {
-      var component = new Set<T>();
+      var component = Set<T>();
       T neighbor;
       do {
         neighbor = stack.removeLast();
diff --git a/lib/src/iterable_zip.dart b/lib/src/iterable_zip.dart
index b983437..c2de80c 100644
--- a/lib/src/iterable_zip.dart
+++ b/lib/src/iterable_zip.dart
@@ -23,7 +23,7 @@
   Iterator<List<T>> get iterator {
     var iterators = _iterables.map((x) => x.iterator).toList(growable: false);
     // TODO(lrn): Return an empty iterator directly if iterators is empty?
-    return new _IteratorZip<T>(iterators);
+    return _IteratorZip<T>(iterators);
   }
 }
 
@@ -41,7 +41,7 @@
         return false;
       }
     }
-    _current = new List(_iterators.length);
+    _current = List(_iterators.length);
     for (int i = 0; i < _iterators.length; i++) {
       _current[i] = _iterators[i].current;
     }
diff --git a/lib/src/priority_queue.dart b/lib/src/priority_queue.dart
index 89c3128..ec2478b 100644
--- a/lib/src/priority_queue.dart
+++ b/lib/src/priority_queue.dart
@@ -128,7 +128,7 @@
   final Comparator<E> comparison;
 
   /// List implementation of a heap.
-  List<E> _queue = new List<E>(_INITIAL_CAPACITY);
+  List<E> _queue = List<E>(_INITIAL_CAPACITY);
 
   /// Number of elements in queue.
   ///
@@ -167,7 +167,7 @@
   }
 
   E get first {
-    if (_length == 0) throw new StateError("No such element");
+    if (_length == 0) throw StateError("No such element");
     return _queue[0];
   }
 
@@ -201,7 +201,7 @@
   }
 
   E removeFirst() {
-    if (_length == 0) throw new StateError("No such element");
+    if (_length == 0) throw StateError("No such element");
     E result = _queue[0];
     E last = _removeLast();
     if (_length > 0) {
@@ -211,14 +211,14 @@
   }
 
   List<E> toList() {
-    List<E> list = new List<E>()..length = _length;
+    List<E> list = List<E>()..length = _length;
     list.setRange(0, _length, _queue);
     list.sort(comparison);
     return list;
   }
 
   Set<E> toSet() {
-    Set<E> set = new SplayTreeSet<E>(comparison);
+    Set<E> set = SplayTreeSet<E>(comparison);
     for (int i = 0; i < _length; i++) {
       set.add(_queue[i]);
     }
@@ -353,7 +353,7 @@
   void _grow() {
     int newCapacity = _queue.length * 2 + 1;
     if (newCapacity < _INITIAL_CAPACITY) newCapacity = _INITIAL_CAPACITY;
-    List<E> newQueue = new List<E>(newCapacity);
+    List<E> newQueue = List<E>(newCapacity);
     newQueue.setRange(0, _length, _queue);
     _queue = newQueue;
   }
diff --git a/lib/src/queue_list.dart b/lib/src/queue_list.dart
index 8b706bf..7bf307b 100644
--- a/lib/src/queue_list.dart
+++ b/lib/src/queue_list.dart
@@ -22,7 +22,7 @@
   /// all elements stored in the returned  are actually instance of [S],
   /// then the returned instance can be used as a `QueueList<T>`.
   static QueueList<T> _castFrom<S, T>(QueueList<S> source) {
-    return new _CastQueueList<S, T>(source);
+    return _CastQueueList<S, T>(source);
   }
 
   static const int _INITIAL_CAPACITY = 8;
@@ -43,7 +43,7 @@
       initialCapacity = _nextPowerOf2(initialCapacity);
     }
     assert(_isPowerOf2(initialCapacity));
-    _table = new List<E>(initialCapacity);
+    _table = List<E>(initialCapacity);
   }
 
   // An internal constructor for use by _CastQueueList.
@@ -53,14 +53,14 @@
   factory QueueList.from(Iterable<E> source) {
     if (source is List) {
       int length = source.length;
-      QueueList<E> queue = new QueueList(length + 1);
+      QueueList<E> queue = QueueList(length + 1);
       assert(queue._table.length > length);
       var sourceList = source;
       queue._table.setRange(0, length, sourceList, 0);
       queue._tail = length;
       return queue;
     } else {
-      return new QueueList<E>()..addAll(source);
+      return QueueList<E>()..addAll(source);
     }
   }
 
@@ -118,7 +118,7 @@
   }
 
   E removeFirst() {
-    if (_head == _tail) throw new StateError("No element");
+    if (_head == _tail) throw StateError("No element");
     E result = _table[_head];
     _table[_head] = null;
     _head = (_head + 1) & (_table.length - 1);
@@ -126,7 +126,7 @@
   }
 
   E removeLast() {
-    if (_head == _tail) throw new StateError("No element");
+    if (_head == _tail) throw StateError("No element");
     _tail = (_tail - 1) & (_table.length - 1);
     E result = _table[_tail];
     _table[_tail] = null;
@@ -138,7 +138,7 @@
   int get length => (_tail - _head) & (_table.length - 1);
 
   set length(int value) {
-    if (value < 0) throw new RangeError("Length $value may not be negative.");
+    if (value < 0) throw RangeError("Length $value may not be negative.");
 
     int delta = value - length;
     if (delta >= 0) {
@@ -162,7 +162,7 @@
 
   E operator [](int index) {
     if (index < 0 || index >= length) {
-      throw new RangeError("Index $index must be in the range [0..$length).");
+      throw RangeError("Index $index must be in the range [0..$length).");
     }
 
     return _table[(_head + index) & (_table.length - 1)];
@@ -170,7 +170,7 @@
 
   void operator []=(int index, E value) {
     if (index < 0 || index >= length) {
-      throw new RangeError("Index $index must be in the range [0..$length).");
+      throw RangeError("Index $index must be in the range [0..$length).");
     }
 
     _table[(_head + index) & (_table.length - 1)] = value;
@@ -207,7 +207,7 @@
 
   /// Grow the table when full.
   void _grow() {
-    List<E> newTable = new List<E>(_table.length * 2);
+    List<E> newTable = List<E>(_table.length * 2);
     int split = _table.length - _head;
     newTable.setRange(0, split, _table, _head);
     newTable.setRange(split, split + _head, _table, 0);
@@ -238,7 +238,7 @@
     // expansion.
     newElementCount += newElementCount >> 1;
     int newCapacity = _nextPowerOf2(newElementCount);
-    List<E> newTable = new List<E>(newCapacity);
+    List<E> newTable = List<E>(newCapacity);
     _tail = _writeToList(newTable);
     _table = newTable;
     _head = 0;
diff --git a/lib/src/union_set.dart b/lib/src/union_set.dart
index 5d88b6b..35ec410 100644
--- a/lib/src/union_set.dart
+++ b/lib/src/union_set.dart
@@ -29,7 +29,7 @@
   /// is, that they contain no elements in common. This makes many operations
   /// including [length] more efficient. If the component sets turn out not to
   /// be disjoint, some operations may behave inconsistently.
-  UnionSet(this._sets, {bool disjoint: false}) : _disjoint = disjoint;
+  UnionSet(this._sets, {bool disjoint = false}) : _disjoint = disjoint;
 
   /// Creates a new set that's a view of the union of all sets in [sets].
   ///
@@ -41,7 +41,7 @@
   /// is, that they contain no elements in common. This makes many operations
   /// including [length] more efficient. If the component sets turn out not to
   /// be disjoint, some operations may behave inconsistently.
-  UnionSet.from(Iterable<Set<E>> sets, {bool disjoint: false})
+  UnionSet.from(Iterable<Set<E>> sets, {bool disjoint = false})
       : this(sets.toSet(), disjoint: disjoint);
 
   int get length => _disjoint
@@ -60,7 +60,7 @@
   /// If the sets aren't guaranteed to be disjoint, this keeps track of the
   /// elements we've already emitted so that we can de-duplicate them.
   Iterable<E> get _dedupIterable {
-    var seen = new Set<E>();
+    var seen = Set<E>();
     return _sets.expand((set) => set).where((element) {
       if (seen.contains(element)) return false;
       seen.add(element);
@@ -79,7 +79,7 @@
   }
 
   Set<E> toSet() {
-    var result = new Set<E>();
+    var result = Set<E>();
     for (var set in _sets) {
       result.addAll(set);
     }
diff --git a/lib/src/union_set_controller.dart b/lib/src/union_set_controller.dart
index 1d0eb74..8253f70 100644
--- a/lib/src/union_set_controller.dart
+++ b/lib/src/union_set_controller.dart
@@ -27,15 +27,15 @@
   UnionSet<E> _set;
 
   /// The sets whose union is exposed through [set].
-  final _sets = new Set<Set<E>>();
+  final _sets = Set<Set<E>>();
 
   /// Creates a set of sets that provides a view of the union of those sets.
   ///
   /// If [disjoint] is `true`, this assumes that all component sets are
   /// disjoint—that is, that they contain no elements in common. This makes
   /// many operations including [length] more efficient.
-  UnionSetController({bool disjoint: false}) {
-    _set = new UnionSet<E>(_sets, disjoint: disjoint);
+  UnionSetController({bool disjoint = false}) {
+    _set = UnionSet<E>(_sets, disjoint: disjoint);
   }
 
   /// Adds the contents of [component] to [set].
diff --git a/lib/src/unmodifiable_wrappers.dart b/lib/src/unmodifiable_wrappers.dart
index b0b5440..0e5c28c 100644
--- a/lib/src/unmodifiable_wrappers.dart
+++ b/lib/src/unmodifiable_wrappers.dart
@@ -27,8 +27,7 @@
 /// change the List's length.
 abstract class NonGrowableListMixin<E> implements List<E> {
   static T _throw<T>() {
-    throw new UnsupportedError(
-        "Cannot change the length of a fixed-length list");
+    throw UnsupportedError("Cannot change the length of a fixed-length list");
   }
 
   /// Throws an [UnsupportedError];
@@ -106,7 +105,7 @@
 /// change the Set.
 abstract class UnmodifiableSetMixin<E> implements Set<E> {
   static T _throw<T>() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Set");
+    throw UnsupportedError("Cannot modify an unmodifiable Set");
   }
 
   /// Throws an [UnsupportedError];
@@ -146,7 +145,7 @@
 /// change the Map.
 abstract class UnmodifiableMapMixin<K, V> implements Map<K, V> {
   static T _throw<T>() {
-    throw new UnsupportedError("Cannot modify an unmodifiable Map");
+    throw UnsupportedError("Cannot modify an unmodifiable Map");
   }
 
   /// Throws an [UnsupportedError];
diff --git a/lib/src/wrappers.dart b/lib/src/wrappers.dart
index f7fe578..236a2c9 100644
--- a/lib/src/wrappers.dart
+++ b/lib/src/wrappers.dart
@@ -7,7 +7,7 @@
 
 import "unmodifiable_wrappers.dart";
 
-typedef K _KeyForValue<K, V>(V value);
+typedef _KeyForValue<K, V> = K Function(V value);
 
 /// A base class for delegating iterables.
 ///
@@ -78,7 +78,7 @@
 
   Iterable<E> takeWhile(bool test(E value)) => _base.takeWhile(test);
 
-  List<E> toList({bool growable: true}) => _base.toList(growable: growable);
+  List<E> toList({bool growable = true}) => _base.toList(growable: growable);
 
   Set<E> toSet() => _base.toSet();
 
@@ -166,7 +166,7 @@
   }
 
   set first(E value) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
+    if (this.isEmpty) throw RangeError.index(0, this);
     this[0] = value;
   }
 
@@ -186,7 +186,7 @@
   }
 
   set last(E value) {
-    if (this.isEmpty) throw new RangeError.index(0, this);
+    if (this.isEmpty) throw RangeError.index(0, this);
     this[this.length - 1] = value;
   }
 
@@ -312,7 +312,7 @@
 
   Set<E> union(Set<E> other) => _setBase.union(other);
 
-  Set<E> toSet() => new DelegatingSet<E>(_setBase.toSet());
+  Set<E> toSet() => DelegatingSet<E>(_setBase.toSet());
 }
 
 /// A [Queue] that delegates all operations to a base queue.
@@ -521,7 +521,7 @@
   /// Throws an [UnsupportedError] since there's no corresponding method for
   /// [Map]s.
   E lookup(Object element) =>
-      throw new UnsupportedError("MapKeySet doesn't support lookup().");
+      throw UnsupportedError("MapKeySet doesn't support lookup().");
 
   @deprecated
   Set<T> retype<T>() => Set.castFrom<E, T>(this);
@@ -656,7 +656,7 @@
   }
 
   void retainAll(Iterable<Object> elements) {
-    var valuesToRetain = new Set<V>.identity();
+    var valuesToRetain = Set<V>.identity();
     for (var element in elements) {
       if (element != null && element is! V) continue;
       var key = _keyForValue(element as V);
diff --git a/pubspec.yaml b/pubspec.yaml
index 983f3f4..926b5c4 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -10,4 +10,5 @@
   sdk: '>=2.0.0 <3.0.0'
 
 dev_dependencies:
+  pedantic: ^1.0.0
   test: ^1.0.0
diff --git a/test/algorithms_test.dart b/test/algorithms_test.dart
index c7f5af1..0ae0916 100644
--- a/test/algorithms_test.dart
+++ b/test/algorithms_test.dart
@@ -12,7 +12,7 @@
   void testShuffle(List list) {
     List copy = list.toList();
     shuffle(list);
-    expect(new UnorderedIterableEquality().equals(list, copy), isTrue);
+    expect(UnorderedIterableEquality().equals(list, copy), isTrue);
   }
 
   test("Shuffle 0", () {
@@ -79,25 +79,25 @@
   });
 
   test("binsearchCompare0", () {
-    expect(binarySearch(<C>[], new C(2), compare: compareC), equals(-1));
+    expect(binarySearch(<C>[], C(2), compare: compareC), equals(-1));
   });
 
   test("binsearchCompare1", () {
-    var l1 = [new C(5)];
-    expect(binarySearch(l1, new C(2), compare: compareC), equals(-1));
-    expect(binarySearch(l1, new C(5), compare: compareC), equals(0));
-    expect(binarySearch(l1, new C(7), compare: compareC), equals(-1));
+    var l1 = [C(5)];
+    expect(binarySearch(l1, C(2), compare: compareC), equals(-1));
+    expect(binarySearch(l1, C(5), compare: compareC), equals(0));
+    expect(binarySearch(l1, C(7), compare: compareC), equals(-1));
   });
 
   test("binsearchCompare3", () {
-    var l3 = [new C(0), new C(5), new C(10)];
-    expect(binarySearch(l3, new C(-1), compare: compareC), equals(-1));
-    expect(binarySearch(l3, new C(0), compare: compareC), equals(0));
-    expect(binarySearch(l3, new C(2), compare: compareC), equals(-1));
-    expect(binarySearch(l3, new C(5), compare: compareC), equals(1));
-    expect(binarySearch(l3, new C(7), compare: compareC), equals(-1));
-    expect(binarySearch(l3, new C(10), compare: compareC), equals(2));
-    expect(binarySearch(l3, new C(12), compare: compareC), equals(-1));
+    var l3 = [C(0), C(5), C(10)];
+    expect(binarySearch(l3, C(-1), compare: compareC), equals(-1));
+    expect(binarySearch(l3, C(0), compare: compareC), equals(0));
+    expect(binarySearch(l3, C(2), compare: compareC), equals(-1));
+    expect(binarySearch(l3, C(5), compare: compareC), equals(1));
+    expect(binarySearch(l3, C(7), compare: compareC), equals(-1));
+    expect(binarySearch(l3, C(10), compare: compareC), equals(2));
+    expect(binarySearch(l3, C(12), compare: compareC), equals(-1));
   });
 
   test("lowerbound0", () {
@@ -126,38 +126,38 @@
   });
 
   test("lowerboundCompare0", () {
-    expect(lowerBound(<C>[], new C(2), compare: compareC), equals(0));
+    expect(lowerBound(<C>[], C(2), compare: compareC), equals(0));
   });
 
   test("lowerboundCompare1", () {
-    var l1 = [new C(5)];
-    expect(lowerBound(l1, new C(2), compare: compareC), equals(0));
-    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
-    expect(lowerBound(l1, new C(7), compare: compareC), equals(1));
+    var l1 = [C(5)];
+    expect(lowerBound(l1, C(2), compare: compareC), equals(0));
+    expect(lowerBound(l1, C(5), compare: compareC), equals(0));
+    expect(lowerBound(l1, C(7), compare: compareC), equals(1));
   });
 
   test("lowerboundCompare3", () {
-    var l3 = [new C(0), new C(5), new C(10)];
-    expect(lowerBound(l3, new C(-1), compare: compareC), equals(0));
-    expect(lowerBound(l3, new C(0), compare: compareC), equals(0));
-    expect(lowerBound(l3, new C(2), compare: compareC), equals(1));
-    expect(lowerBound(l3, new C(5), compare: compareC), equals(1));
-    expect(lowerBound(l3, new C(7), compare: compareC), equals(2));
-    expect(lowerBound(l3, new C(10), compare: compareC), equals(2));
-    expect(lowerBound(l3, new C(12), compare: compareC), equals(3));
+    var l3 = [C(0), C(5), C(10)];
+    expect(lowerBound(l3, C(-1), compare: compareC), equals(0));
+    expect(lowerBound(l3, C(0), compare: compareC), equals(0));
+    expect(lowerBound(l3, C(2), compare: compareC), equals(1));
+    expect(lowerBound(l3, C(5), compare: compareC), equals(1));
+    expect(lowerBound(l3, C(7), compare: compareC), equals(2));
+    expect(lowerBound(l3, C(10), compare: compareC), equals(2));
+    expect(lowerBound(l3, C(12), compare: compareC), equals(3));
   });
 
   test("lowerboundCompareRepeat", () {
-    var l1 = [new C(5), new C(5), new C(5)];
-    var l2 = [new C(0), new C(5), new C(5), new C(5), new C(10)];
-    expect(lowerBound(l1, new C(5), compare: compareC), equals(0));
-    expect(lowerBound(l2, new C(5), compare: compareC), equals(1));
+    var l1 = [C(5), C(5), C(5)];
+    var l2 = [C(0), C(5), C(5), C(5), C(10)];
+    expect(lowerBound(l1, C(5), compare: compareC), equals(0));
+    expect(lowerBound(l2, C(5), compare: compareC), equals(1));
   });
 
   test("insertionSortRandom", () {
-    Random random = new Random();
+    Random random = Random();
     for (int i = 0; i < 25; i++) {
-      List list = new List(i);
+      List list = List(i);
       for (int j = 0; j < i; j++) {
         list[j] = random.nextInt(25); // Expect some equal elements.
       }
@@ -193,9 +193,9 @@
   });
 
   test("MergeSortRandom", () {
-    Random random = new Random();
+    Random random = Random();
     for (int i = 0; i < 250; i += 1) {
-      List list = new List(i);
+      List list = List(i);
       for (int j = 0; j < i; j++) {
         list[j] = random.nextInt(i); // Expect some equal elements.
       }
@@ -207,18 +207,18 @@
   });
 
   test("MergeSortPreservesOrder", () {
-    Random random = new Random();
+    Random random = Random();
     // Small case where only insertion call is called,
     // larger case where the internal moving insertion sort is used
     // larger cases with multiple splittings, numbers just around a power of 2.
     for (int size in [8, 50, 511, 512, 513]) {
-      var list = new List<OC>(size);
+      var list = List<OC>(size);
       // Class OC compares using id.
       // With size elements with id's in the range 0..size/4, a number of
       // collisions are guaranteed. These should be sorted so that the "order"
       // part of the objects are still in order.
       for (int i = 0; i < size; i++) {
-        list[i] = new OC(random.nextInt(size >> 2), i);
+        list[i] = OC(random.nextInt(size >> 2), i);
       }
       mergeSort(list);
       OC prev = list[0];
@@ -255,18 +255,18 @@
   test("MergeSortSpecialCases", () {
     for (int size in [511, 512, 513]) {
       // All equal.
-      List list = new List(size);
+      List list = List(size);
       for (int i = 0; i < size; i++) {
-        list[i] = new OC(0, i);
+        list[i] = OC(0, i);
       }
       mergeSort(list);
       for (int i = 0; i < size; i++) {
         expect(list[i].order, equals(i));
       }
       // All but one equal, first.
-      list[0] = new OC(1, 0);
+      list[0] = OC(1, 0);
       for (int i = 1; i < size; i++) {
-        list[i] = new OC(0, i);
+        list[i] = OC(0, i);
       }
       mergeSort(list);
       for (int i = 0; i < size - 1; i++) {
@@ -276,9 +276,9 @@
 
       // All but one equal, last.
       for (int i = 0; i < size - 1; i++) {
-        list[i] = new OC(0, i);
+        list[i] = OC(0, i);
       }
-      list[size - 1] = new OC(-1, size - 1);
+      list[size - 1] = OC(-1, size - 1);
       mergeSort(list);
       expect(list[0].order, equals(size - 1));
       for (int i = 1; i < size; i++) {
@@ -287,7 +287,7 @@
 
       // Reversed.
       for (int i = 0; i < size; i++) {
-        list[i] = new OC(size - 1 - i, i);
+        list[i] = OC(size - 1 - i, i);
       }
       mergeSort(list);
       for (int i = 0; i < size; i++) {
diff --git a/test/canonicalized_map_test.dart b/test/canonicalized_map_test.dart
index 078e57c..4ec0054 100644
--- a/test/canonicalized_map_test.dart
+++ b/test/canonicalized_map_test.dart
@@ -10,8 +10,8 @@
     CanonicalizedMap<int, String, String> map;
 
     setUp(() {
-      map = new CanonicalizedMap(int.parse,
-          isValidKey: (s) => new RegExp(r"^\d+$").hasMatch(s as String));
+      map = CanonicalizedMap(int.parse,
+          isValidKey: (s) => RegExp(r"^\d+$").hasMatch(s as String));
     });
 
     test("canonicalizes keys on set and get", () {
@@ -62,7 +62,7 @@
 
     test("canonicalizes keys for putIfAbsent", () {
       map["1"] = "value";
-      expect(map.putIfAbsent("01", () => throw new Exception("shouldn't run")),
+      expect(map.putIfAbsent("01", () => throw Exception("shouldn't run")),
           equals("value"));
       expect(map.putIfAbsent("2", () => "new value"), equals("new value"));
     });
@@ -148,9 +148,9 @@
 
     test("addEntries adds key-value pairs to the map", () {
       map.addEntries([
-        new MapEntry("1", "value 1"),
-        new MapEntry("01", "value 01"),
-        new MapEntry("2", "value 2"),
+        MapEntry("1", "value 1"),
+        MapEntry("01", "value 01"),
+        MapEntry("2", "value 2"),
       ]);
       expect(map, {"01": "value 01", "2": "value 2"});
     });
@@ -163,8 +163,8 @@
   group("CanonicalizedMap builds an informative string representation", () {
     var map;
     setUp(() {
-      map = new CanonicalizedMap<int, String, dynamic>(int.parse,
-          isValidKey: (s) => new RegExp(r"^\d+$").hasMatch(s as String));
+      map = CanonicalizedMap<int, String, dynamic>(int.parse,
+          isValidKey: (s) => RegExp(r"^\d+$").hasMatch(s as String));
     });
 
     test("for an empty map", () {
@@ -191,7 +191,7 @@
 
   group("CanonicalizedMap.from", () {
     test("canonicalizes its keys", () {
-      var map = new CanonicalizedMap.from(
+      var map = CanonicalizedMap.from(
           {"1": "value 1", "2": "value 2", "3": "value 3"}, int.parse);
       expect(map["01"], equals("value 1"));
       expect(map["02"], equals("value 2"));
@@ -199,7 +199,7 @@
     });
 
     test("uses the final value for collisions", () {
-      var map = new CanonicalizedMap.from(
+      var map = CanonicalizedMap.from(
           {"1": "value 1", "01": "value 2", "001": "value 3"}, int.parse);
       expect(map.length, equals(1));
       expect(map["0001"], equals("value 3"));
diff --git a/test/combined_wrapper/iterable_test.dart b/test/combined_wrapper/iterable_test.dart
index 3301821..9fb9e39 100644
--- a/test/combined_wrapper/iterable_test.dart
+++ b/test/combined_wrapper/iterable_test.dart
@@ -6,35 +6,35 @@
 import 'package:test/test.dart';
 
 void main() {
-  var iterable1 = new Iterable.generate(3);
-  var iterable2 = new Iterable.generate(3, (i) => i + 3);
-  var iterable3 = new Iterable.generate(3, (i) => i + 6);
+  var iterable1 = Iterable.generate(3);
+  var iterable2 = Iterable.generate(3, (i) => i + 3);
+  var iterable3 = Iterable.generate(3, (i) => i + 6);
 
   test('should combine multiple iterables when iterating', () {
-    var combined = new CombinedIterableView([iterable1, iterable2, iterable3]);
+    var combined = CombinedIterableView([iterable1, iterable2, iterable3]);
     expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
   });
 
   test('should combine multiple iterables with some empty ones', () {
     var combined =
-        new CombinedIterableView([iterable1, [], iterable2, [], iterable3, []]);
+        CombinedIterableView([iterable1, [], iterable2, [], iterable3, []]);
     expect(combined, [0, 1, 2, 3, 4, 5, 6, 7, 8]);
   });
 
   test('should function as an empty iterable when no iterables are passed', () {
-    var empty = new CombinedIterableView([]);
+    var empty = CombinedIterableView([]);
     expect(empty, isEmpty);
   });
 
   test('should function as an empty iterable with all empty iterables', () {
-    var empty = new CombinedIterableView([[], [], []]);
+    var empty = CombinedIterableView([[], [], []]);
     expect(empty, isEmpty);
   });
 
   test('should reflect changes from the underlying iterables', () {
     var list1 = [];
     var list2 = [];
-    var combined = new CombinedIterableView([list1, list2]);
+    var combined = CombinedIterableView([list1, list2]);
     expect(combined, isEmpty);
     list1.addAll([1, 2]);
     list2.addAll([3, 4]);
@@ -45,7 +45,7 @@
 
   test('should reflect changes from the iterable of iterables', () {
     var iterables = <Iterable>[];
-    var combined = new CombinedIterableView(iterables);
+    var combined = CombinedIterableView(iterables);
     expect(combined, isEmpty);
     expect(combined, hasLength(0));
 
diff --git a/test/combined_wrapper/list_test.dart b/test/combined_wrapper/list_test.dart
index 9e90925..5bb0cb1 100644
--- a/test/combined_wrapper/list_test.dart
+++ b/test/combined_wrapper/list_test.dart
@@ -15,20 +15,20 @@
 
   // In every way possible this should test the same as an UnmodifiableListView.
   common.testUnmodifiableList(
-      concat, new CombinedListView([list1, list2, list3]), 'combineLists');
+      concat, CombinedListView([list1, list2, list3]), 'combineLists');
 
   common.testUnmodifiableList(concat,
-      new CombinedListView([list1, [], list2, [], list3, []]), 'combineLists');
+      CombinedListView([list1, [], list2, [], list3, []]), 'combineLists');
 
   test('should function as an empty list when no lists are passed', () {
-    var empty = new CombinedListView([]);
+    var empty = CombinedListView([]);
     expect(empty, isEmpty);
     expect(empty.length, 0);
     expect(() => empty[0], throwsRangeError);
   });
 
   test('should function as an empty list when only empty lists are passed', () {
-    var empty = new CombinedListView([[], [], []]);
+    var empty = CombinedListView([[], [], []]);
     expect(empty, isEmpty);
     expect(empty.length, 0);
     expect(() => empty[0], throwsRangeError);
@@ -37,7 +37,7 @@
   test('should reflect underlying changes back to the combined list', () {
     var backing1 = <int>[];
     var backing2 = <int>[];
-    var combined = new CombinedListView([backing1, backing2]);
+    var combined = CombinedListView([backing1, backing2]);
     expect(combined, isEmpty);
     backing1.addAll(list1);
     expect(combined, list1);
@@ -47,7 +47,7 @@
 
   test('should reflect underlying changes from the list of lists', () {
     var listOfLists = <List<int>>[];
-    var combined = new CombinedListView(listOfLists);
+    var combined = CombinedListView(listOfLists);
     expect(combined, isEmpty);
     listOfLists.add(list1);
     expect(combined, list1);
@@ -59,7 +59,7 @@
 
   test('should reflect underlying changes with a single list', () {
     var backing1 = <int>[];
-    var combined = new CombinedListView([backing1]);
+    var combined = CombinedListView([backing1]);
     expect(combined, isEmpty);
     backing1.addAll(list1);
     expect(combined, list1);
diff --git a/test/combined_wrapper/map_test.dart b/test/combined_wrapper/map_test.dart
index ecafb4b..605c0be 100644
--- a/test/combined_wrapper/map_test.dart
+++ b/test/combined_wrapper/map_test.dart
@@ -15,21 +15,19 @@
 
   // In every way possible this should test the same as an UnmodifiableMapView.
   common.testReadMap(
-      concat, new CombinedMapView([map1, map2, map3]), 'CombinedMapView');
+      concat, CombinedMapView([map1, map2, map3]), 'CombinedMapView');
 
-  common.testReadMap(
-      concat,
-      new CombinedMapView([map1, {}, map2, {}, map3, {}]),
+  common.testReadMap(concat, CombinedMapView([map1, {}, map2, {}, map3, {}]),
       'CombinedMapView (some empty)');
 
   test('should function as an empty map when no maps are passed', () {
-    var empty = new CombinedMapView([]);
+    var empty = CombinedMapView([]);
     expect(empty, isEmpty);
     expect(empty.length, 0);
   });
 
   test('should function as an empty map when only empty maps are passed', () {
-    var empty = new CombinedMapView([{}, {}, {}]);
+    var empty = CombinedMapView([{}, {}, {}]);
     expect(empty, isEmpty);
     expect(empty.length, 0);
   });
@@ -37,17 +35,17 @@
   test('should reflect underlying changes back to the combined map', () {
     var backing1 = <int, int>{};
     var backing2 = <int, int>{};
-    var combined = new CombinedMapView([backing1, backing2]);
+    var combined = CombinedMapView([backing1, backing2]);
     expect(combined, isEmpty);
     backing1.addAll(map1);
     expect(combined, map1);
     backing2.addAll(map2);
-    expect(combined, new Map.from(backing1)..addAll(backing2));
+    expect(combined, Map.from(backing1)..addAll(backing2));
   });
 
   test('should reflect underlying changes with a single map', () {
     var backing1 = <int, int>{};
-    var combined = new CombinedMapView([backing1]);
+    var combined = CombinedMapView([backing1]);
     expect(combined, isEmpty);
     backing1.addAll(map1);
     expect(combined, map1);
diff --git a/test/comparators_test.dart b/test/comparators_test.dart
index 3df0812..6a5cce8 100644
--- a/test/comparators_test.dart
+++ b/test/comparators_test.dart
@@ -85,11 +85,9 @@
   // This will sort alphabetically (by charcode) the way digits sort
   // numerically, and the leading 0 means it sorts like a digit
   // compared to non-digits.
-  replaceNumbers(String string) =>
-      string.replaceAllMapped(new RegExp(r"\d+"), (m) {
+  replaceNumbers(String string) => string.replaceAllMapped(RegExp(r"\d+"), (m) {
         var digits = m[0];
-        return new String.fromCharCodes(
-            [0x30, int.parse(digits), digits.length]);
+        return String.fromCharCodes([0x30, int.parse(digits), digits.length]);
       });
 
   test("compareNatural", () {
diff --git a/test/equality_map_test.dart b/test/equality_map_test.dart
index 8225efd..64344fe 100644
--- a/test/equality_map_test.dart
+++ b/test/equality_map_test.dart
@@ -7,7 +7,7 @@
 
 void main() {
   test("uses the given equality", () {
-    var map = new EqualityMap(const IterableEquality());
+    var map = EqualityMap(const IterableEquality());
     expect(map, isEmpty);
 
     map[[1, 2, 3]] = 1;
@@ -22,7 +22,7 @@
   });
 
   test("EqualityMap.from() prefers the lattermost equivalent key", () {
-    var map = new EqualityMap.from(const IterableEquality(), {
+    var map = EqualityMap.from(const IterableEquality(), {
       [1, 2, 3]: 1,
       [2, 3, 4]: 2,
       [1, 2, 3]: 3,
diff --git a/test/equality_set_test.dart b/test/equality_set_test.dart
index a326b31..a99fe1f 100644
--- a/test/equality_set_test.dart
+++ b/test/equality_set_test.dart
@@ -7,7 +7,7 @@
 
 void main() {
   test("uses the given equality", () {
-    var set = new EqualitySet(const IterableEquality());
+    var set = EqualitySet(const IterableEquality());
     expect(set, isEmpty);
 
     var list1 = [1, 2, 3];
@@ -35,7 +35,7 @@
     var list5 = [1, 2, 3];
     var list6 = [1, 2, 3];
 
-    var set = new EqualitySet.from(
+    var set = EqualitySet.from(
         const IterableEquality(), [list1, list2, list3, list4, list5, list6]);
 
     expect(set, contains(same(list1)));
diff --git a/test/equality_test.dart b/test/equality_test.dart
index ffc8655..2b3a229 100644
--- a/test/equality_test.dart
+++ b/test/equality_test.dart
@@ -9,7 +9,7 @@
 import "package:test/test.dart";
 
 main() {
-  o(Comparable id) => new Element(id);
+  o(Comparable id) => Element(id);
 
   // Lists that are point-wise equal, but not identical.
   var list1 = [o(1), o(2), o(3), o(4), o(5)];
@@ -19,42 +19,41 @@
 
   test("IterableEquality - List", () {
     expect(const IterableEquality().equals(list1, list2), isTrue);
-    Equality iterId = const IterableEquality(const IdentityEquality());
+    Equality iterId = const IterableEquality(IdentityEquality());
     expect(iterId.equals(list1, list2), isFalse);
   });
 
   test("IterableEquality - LinkedSet", () {
-    var l1 = new LinkedHashSet.from(list1);
-    var l2 = new LinkedHashSet.from(list2);
+    var l1 = LinkedHashSet.from(list1);
+    var l2 = LinkedHashSet.from(list2);
     expect(const IterableEquality().equals(l1, l2), isTrue);
-    Equality iterId = const IterableEquality(const IdentityEquality());
+    Equality iterId = const IterableEquality(IdentityEquality());
     expect(iterId.equals(l1, l2), isFalse);
   });
 
   test("ListEquality", () {
     expect(const ListEquality().equals(list1, list2), isTrue);
-    Equality listId = const ListEquality(const IdentityEquality());
+    Equality listId = const ListEquality(IdentityEquality());
     expect(listId.equals(list1, list2), isFalse);
   });
 
   test("ListInequality length", () {
     var list4 = [o(1), o(2), o(3), o(4), o(5), o(6)];
     expect(const ListEquality().equals(list1, list4), isFalse);
-    expect(const ListEquality(const IdentityEquality()).equals(list1, list4),
-        isFalse);
+    expect(
+        const ListEquality(IdentityEquality()).equals(list1, list4), isFalse);
   });
 
   test("ListInequality value", () {
     var list5 = [o(1), o(2), o(3), o(4), o(6)];
     expect(const ListEquality().equals(list1, list5), isFalse);
-    expect(const ListEquality(const IdentityEquality()).equals(list1, list5),
-        isFalse);
+    expect(
+        const ListEquality(IdentityEquality()).equals(list1, list5), isFalse);
   });
 
   test("UnorderedIterableEquality", () {
     expect(const UnorderedIterableEquality().equals(list1, list3), isTrue);
-    Equality uniterId =
-        const UnorderedIterableEquality(const IdentityEquality());
+    Equality uniterId = const UnorderedIterableEquality(IdentityEquality());
     expect(uniterId.equals(list1, list3), isFalse);
   });
 
@@ -62,7 +61,7 @@
     var list6 = [o(1), o(3), o(5), o(4), o(2), o(1)];
     expect(const UnorderedIterableEquality().equals(list1, list6), isFalse);
     expect(
-        const UnorderedIterableEquality(const IdentityEquality())
+        const UnorderedIterableEquality(IdentityEquality())
             .equals(list1, list6),
         isFalse);
   });
@@ -71,35 +70,33 @@
     var list7 = [o(1), o(3), o(5), o(4), o(6)];
     expect(const UnorderedIterableEquality().equals(list1, list7), isFalse);
     expect(
-        const UnorderedIterableEquality(const IdentityEquality())
+        const UnorderedIterableEquality(IdentityEquality())
             .equals(list1, list7),
         isFalse);
   });
 
   test("SetEquality", () {
-    var set1 = new HashSet.from(list1);
-    var set2 = new LinkedHashSet.from(list3);
+    var set1 = HashSet.from(list1);
+    var set2 = LinkedHashSet.from(list3);
     expect(const SetEquality().equals(set1, set2), isTrue);
-    Equality setId = const SetEquality(const IdentityEquality());
+    Equality setId = const SetEquality(IdentityEquality());
     expect(setId.equals(set1, set2), isFalse);
   });
 
   test("SetInequality length", () {
     var list8 = [o(1), o(3), o(5), o(4), o(2), o(6)];
-    var set1 = new HashSet.from(list1);
-    var set2 = new LinkedHashSet.from(list8);
+    var set1 = HashSet.from(list1);
+    var set2 = LinkedHashSet.from(list8);
     expect(const SetEquality().equals(set1, set2), isFalse);
-    expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
-        isFalse);
+    expect(const SetEquality(IdentityEquality()).equals(set1, set2), isFalse);
   });
 
   test("SetInequality value", () {
     var list7 = [o(1), o(3), o(5), o(4), o(6)];
-    var set1 = new HashSet.from(list1);
-    var set2 = new LinkedHashSet.from(list7);
+    var set1 = HashSet.from(list1);
+    var set2 = LinkedHashSet.from(list7);
     expect(const SetEquality().equals(set1, set2), isFalse);
-    expect(const SetEquality(const IdentityEquality()).equals(set1, set2),
-        isFalse);
+    expect(const SetEquality(IdentityEquality()).equals(set1, set2), isFalse);
   });
 
   var map1a = {
@@ -120,21 +117,21 @@
   };
   var l1 = [map1a, map1b];
   var l2 = [map2a, map2b];
-  var s1 = new Set<Map>.from(l1);
-  var s2 = new Set<Map>.from([map2b, map2a]);
+  var s1 = Set<Map>.from(l1);
+  var s2 = Set<Map>.from([map2b, map2a]);
 
   test("RecursiveEquality", () {
-    const unordered = const UnorderedIterableEquality();
+    const unordered = UnorderedIterableEquality();
     expect(unordered.equals(map1a["x"], map2a["x"]), isTrue);
     expect(unordered.equals(map1a["y"], map2a["y"]), isTrue);
     expect(unordered.equals(map1b["x"], map2b["x"]), isTrue);
     expect(unordered.equals(map1b["y"], map2b["y"]), isTrue);
-    const mapval = const MapEquality(values: unordered);
+    const mapval = MapEquality(values: unordered);
     expect(mapval.equals(map1a, map2a), isTrue);
     expect(mapval.equals(map1b, map2b), isTrue);
-    const listmapval = const ListEquality(mapval);
+    const listmapval = ListEquality(mapval);
     expect(listmapval.equals(l1, l2), isTrue);
-    const setmapval = const SetEquality<Map>(mapval);
+    const setmapval = SetEquality<Map>(mapval);
     expect(setmapval.equals(s1, s2), isTrue);
   });
 
@@ -166,10 +163,10 @@
   });
 
   group("EqualityBy should use a derived value for ", () {
-    var firstEquality = new EqualityBy<List<String>, String>((e) => e.first);
-    var firstInsensitiveEquality = new EqualityBy<List<String>, String>(
+    var firstEquality = EqualityBy<List<String>, String>((e) => e.first);
+    var firstInsensitiveEquality = EqualityBy<List<String>, String>(
         (e) => e.first, const CaseInsensitiveEquality());
-    var firstObjectEquality = new EqualityBy<List<Object>, Object>(
+    var firstObjectEquality = EqualityBy<List<Object>, Object>(
         (e) => e.first, const IterableEquality());
 
     test("equality", () {
@@ -204,10 +201,10 @@
   });
 
   test("Equality accepts null", () {
-    var ie = new IterableEquality();
-    var le = new ListEquality();
-    var se = new SetEquality();
-    var me = new MapEquality();
+    var ie = IterableEquality();
+    var le = ListEquality();
+    var se = SetEquality();
+    var me = MapEquality();
     expect(ie.equals(null, null), true);
     expect(ie.equals([], null), false);
     expect(ie.equals(null, []), false);
@@ -219,8 +216,8 @@
     expect(le.hash(null), null.hashCode);
 
     expect(se.equals(null, null), true);
-    expect(se.equals(new Set(), null), false);
-    expect(se.equals(null, new Set()), false);
+    expect(se.equals(Set(), null), false);
+    expect(se.equals(null, Set()), false);
     expect(se.hash(null), null.hashCode);
 
     expect(me.equals(null, null), true);
diff --git a/test/functions_test.dart b/test/functions_test.dart
index a1e8f08..809d486 100644
--- a/test/functions_test.dart
+++ b/test/functions_test.dart
@@ -220,7 +220,7 @@
       expect(
           stronglyConnectedComponents({"a": []}),
           equals([
-            new Set.from(["a"])
+            Set.from(["a"])
           ]));
     });
 
@@ -231,8 +231,8 @@
             "b": []
           }),
           equals([
-            new Set.from(["a"]),
-            new Set.from(["b"])
+            Set.from(["a"]),
+            Set.from(["b"])
           ]));
     });
 
@@ -243,7 +243,7 @@
             "b": ["a"]
           }),
           equals([
-            new Set.from(["a", "b"])
+            Set.from(["a", "b"])
           ]));
     });
 
@@ -261,12 +261,12 @@
             // This is expected to return *a* topological ordering, but this isn't
             // the only valid one. If the function implementation changes in the
             // future, this test may need to be updated.
-            new Set.from(["foo"]),
-            new Set.from(["bar"]),
-            new Set.from(["bang"]),
-            new Set.from(["zap"]),
-            new Set.from(["baz"]),
-            new Set.from(["qux"])
+            Set.from(["foo"]),
+            Set.from(["bar"]),
+            Set.from(["bang"]),
+            Set.from(["zap"]),
+            Set.from(["baz"]),
+            Set.from(["qux"])
           ]));
     });
 
@@ -279,7 +279,7 @@
             "bang": ["foo"]
           }),
           equals([
-            new Set.from(["foo", "bar", "baz", "bang"])
+            Set.from(["foo", "bar", "baz", "bang"])
           ]));
     });
 
@@ -300,9 +300,9 @@
             // This is expected to return *a* topological ordering, but this isn't
             // the only valid one. If the function implementation changes in the
             // future, this test may need to be updated.
-            new Set.from(["a", "b", "e"]),
-            new Set.from(["c", "d", "h"]),
-            new Set.from(["f", "g"]),
+            Set.from(["a", "b", "e"]),
+            Set.from(["c", "d", "h"]),
+            Set.from(["f", "g"]),
           ]));
     });
 
@@ -320,12 +320,12 @@
             // This is expected to return *a* topological ordering, but this isn't
             // the only valid one. If the function implementation changes in the
             // future, this test may need to be updated.
-            new Set.from(["foo"]),
-            new Set.from(["bar"]),
-            new Set.from(["bang"]),
-            new Set.from(["zap"]),
-            new Set.from(["baz"]),
-            new Set.from(["qux"])
+            Set.from(["foo"]),
+            Set.from(["bar"]),
+            Set.from(["bang"]),
+            Set.from(["zap"]),
+            Set.from(["baz"]),
+            Set.from(["qux"])
           ]));
     });
   });
diff --git a/test/iterable_zip_test.dart b/test/iterable_zip_test.dart
index 7b6db73..75a448d 100644
--- a/test/iterable_zip_test.dart
+++ b/test/iterable_zip_test.dart
@@ -17,7 +17,7 @@
 main() {
   test("Basic", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]
@@ -31,7 +31,7 @@
 
   test("Uneven length 1", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3, 99, 100],
           [4, 5, 6],
           [7, 8, 9]
@@ -45,7 +45,7 @@
 
   test("Uneven length 2", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [4, 5, 6, 99, 100],
           [7, 8, 9]
@@ -59,7 +59,7 @@
 
   test("Uneven length 3", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [4, 5, 6],
           [7, 8, 9, 99, 100]
@@ -73,7 +73,7 @@
 
   test("Uneven length 3", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3, 98],
           [4, 5, 6],
           [7, 8, 9, 99, 100]
@@ -87,7 +87,7 @@
 
   test("Empty 1", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [],
           [4, 5, 6],
           [7, 8, 9]
@@ -97,7 +97,7 @@
 
   test("Empty 2", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [],
           [7, 8, 9]
@@ -107,7 +107,7 @@
 
   test("Empty 3", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [4, 5, 6],
           []
@@ -116,12 +116,12 @@
   });
 
   test("Empty source", () {
-    expect(new IterableZip([]), equals([]));
+    expect(IterableZip([]), equals([]));
   });
 
   test("Single Source", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3]
         ]),
         equals([
@@ -134,16 +134,15 @@
   test("Not-lists", () {
     // Use other iterables than list literals.
     Iterable it1 = [1, 2, 3, 4, 5, 6].where((x) => x < 4);
-    Set it2 = new LinkedHashSet()..add(4)..add(5)..add(6);
-    Iterable it3 = (new LinkedHashMap()
+    Set it2 = LinkedHashSet()..add(4)..add(5)..add(6);
+    Iterable it3 = (LinkedHashMap()
           ..[7] = 0
           ..[8] = 0
           ..[9] = 0)
         .keys;
-    Iterable<Iterable> allIts =
-        new Iterable.generate(3, (i) => [it1, it2, it3][i]);
+    Iterable<Iterable> allIts = Iterable.generate(3, (i) => [it1, it2, it3][i]);
     expect(
-        new IterableZip(allIts),
+        IterableZip(allIts),
         equals([
           [1, 4, 7],
           [2, 5, 8],
@@ -153,7 +152,7 @@
 
   test("Error 1", () {
     expect(
-        () => new IterableZip([
+        () => IterableZip([
               iterError([1, 2, 3], 2),
               [4, 5, 6],
               [7, 8, 9]
@@ -163,7 +162,7 @@
 
   test("Error 2", () {
     expect(
-        () => new IterableZip([
+        () => IterableZip([
               [1, 2, 3],
               iterError([4, 5, 6], 5),
               [7, 8, 9]
@@ -173,7 +172,7 @@
 
   test("Error 3", () {
     expect(
-        () => new IterableZip([
+        () => IterableZip([
               [1, 2, 3],
               [4, 5, 6],
               iterError([7, 8, 9], 8)
@@ -183,7 +182,7 @@
 
   test("Error at end", () {
     expect(
-        () => new IterableZip([
+        () => IterableZip([
               [1, 2, 3],
               iterError([4, 5, 6], 6),
               [7, 8, 9]
@@ -193,7 +192,7 @@
 
   test("Error before first end", () {
     expect(
-        () => new IterableZip([
+        () => IterableZip([
               iterError([1, 2, 3, 4], 4),
               [4, 5, 6],
               [7, 8, 9]
@@ -203,7 +202,7 @@
 
   test("Error after first end", () {
     expect(
-        new IterableZip([
+        IterableZip([
           [1, 2, 3],
           [4, 5, 6],
           iterError([7, 8, 9, 10], 10)
diff --git a/test/priority_queue_test.dart b/test/priority_queue_test.dart
index 92b6d33..aefd346 100644
--- a/test/priority_queue_test.dart
+++ b/test/priority_queue_test.dart
@@ -10,33 +10,32 @@
 
 void main() {
   testDefault();
-  testInt(() => new HeapPriorityQueue<int>());
-  testCustom((comparator) => new HeapPriorityQueue<C>(comparator));
+  testInt(() => HeapPriorityQueue<int>());
+  testCustom((comparator) => HeapPriorityQueue<C>(comparator));
 }
 
 void testDefault() {
   test('new PriorityQueue() returns a HeapPriorityQueue', () {
-    expect(new PriorityQueue<int>(), new TypeMatcher<HeapPriorityQueue<int>>());
+    expect(PriorityQueue<int>(), TypeMatcher<HeapPriorityQueue<int>>());
   });
-  testInt(() => new PriorityQueue<int>());
-  testCustom((comparator) => new PriorityQueue<C>(comparator));
+  testInt(() => PriorityQueue<int>());
+  testCustom((comparator) => PriorityQueue<C>(comparator));
 }
 
 void testInt(PriorityQueue<int> create()) {
   for (int count in [1, 5, 127, 128]) {
-    testQueue(
-        "int:$count", create, new List<int>.generate(count, (x) => x), count);
+    testQueue("int:$count", create, List<int>.generate(count, (x) => x), count);
   }
 }
 
 void testCustom(PriorityQueue<C> create(int comparator(C a, C b))) {
   for (int count in [1, 5, 127, 128]) {
     testQueue("Custom:$count/null", () => create(null),
-        new List<C>.generate(count, (x) => new C(x)), new C(count));
+        List<C>.generate(count, (x) => C(x)), C(count));
     testQueue("Custom:$count/compare", () => create(compare),
-        new List<C>.generate(count, (x) => new C(x)), new C(count));
+        List<C>.generate(count, (x) => C(x)), C(count));
     testQueue("Custom:$count/compareNeg", () => create(compareNeg),
-        new List<C>.generate(count, (x) => new C(count - x)), new C(0));
+        List<C>.generate(count, (x) => C(count - x)), C(0));
   }
 }
 
diff --git a/test/queue_list_test.dart b/test/queue_list_test.dart
index 543cbae..9522a39 100644
--- a/test/queue_list_test.dart
+++ b/test/queue_list_test.dart
@@ -10,21 +10,21 @@
 void main() {
   group("new QueueList()", () {
     test("creates an empty QueueList", () {
-      expect(new QueueList(), isEmpty);
+      expect(QueueList(), isEmpty);
     });
 
     test("takes an initial capacity", () {
-      expect(new QueueList(100), isEmpty);
+      expect(QueueList(100), isEmpty);
     });
   });
 
   test("new QueueList.from() copies the contents of an iterable", () {
-    expect(new QueueList.from([1, 2, 3].skip(1)), equals([2, 3]));
+    expect(QueueList.from([1, 2, 3].skip(1)), equals([2, 3]));
   });
 
   group("add()", () {
     test("adds an element to the end of the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       queue.add(4);
       expect(queue, equals([1, 2, 3, 4]));
     });
@@ -38,7 +38,7 @@
 
   group("addAll()", () {
     test("adds elements to the end of the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       queue.addAll([4, 5, 6]);
       expect(queue, equals([1, 2, 3, 4, 5, 6]));
     });
@@ -52,7 +52,7 @@
 
   group("addFirst()", () {
     test("adds an element to the beginning of the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       queue.addFirst(0);
       expect(queue, equals([0, 1, 2, 3]));
     });
@@ -66,7 +66,7 @@
 
   group("removeFirst()", () {
     test("removes an element from the beginning of the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(queue.removeFirst(), equals(1));
       expect(queue, equals([2, 3]));
     });
@@ -86,13 +86,13 @@
     });
 
     test("throws a StateError for an empty queue", () {
-      expect(new QueueList().removeFirst, throwsStateError);
+      expect(QueueList().removeFirst, throwsStateError);
     });
   });
 
   group("removeLast()", () {
     test("removes an element from the end of the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(queue.removeLast(), equals(3));
       expect(queue, equals([1, 2]));
     });
@@ -110,13 +110,13 @@
     });
 
     test("throws a StateError for an empty queue", () {
-      expect(new QueueList().removeLast, throwsStateError);
+      expect(QueueList().removeLast, throwsStateError);
     });
   });
 
   group("length", () {
     test("returns the length of a queue", () {
-      expect(new QueueList.from([1, 2, 3]).length, equals(3));
+      expect(QueueList.from([1, 2, 3]).length, equals(3));
     });
 
     test("returns the length of a queue with an internal gap", () {
@@ -130,25 +130,25 @@
 
   group("length=", () {
     test("shrinks a larger queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       queue.length = 1;
       expect(queue, equals([1]));
     });
 
     test("grows a smaller queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       queue.length = 5;
       expect(queue, equals([1, 2, 3, null, null]));
     });
 
     test("throws a RangeError if length is less than 0", () {
-      expect(() => new QueueList().length = -1, throwsRangeError);
+      expect(() => QueueList().length = -1, throwsRangeError);
     });
   });
 
   group("[]", () {
     test("returns individual entries in the queue", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(queue[0], equals(1));
       expect(queue[1], equals(2));
       expect(queue[2], equals(3));
@@ -166,21 +166,21 @@
     });
 
     test("throws a RangeError if the index is less than 0", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(() => queue[-1], throwsRangeError);
     });
 
     test(
         "throws a RangeError if the index is greater than or equal to the "
         "length", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(() => queue[3], throwsRangeError);
     });
   });
 
   group("[]=", () {
     test("sets individual entries in the queue", () {
-      var queue = new QueueList<dynamic>.from([1, 2, 3]);
+      var queue = QueueList<dynamic>.from([1, 2, 3]);
       queue[0] = "a";
       queue[1] = "b";
       queue[2] = "c";
@@ -200,7 +200,7 @@
     });
 
     test("throws a RangeError if the index is less than 0", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(() {
         queue[-1] = 0;
       }, throwsRangeError);
@@ -209,7 +209,7 @@
     test(
         "throws a RangeError if the index is greater than or equal to the "
         "length", () {
-      var queue = new QueueList.from([1, 2, 3]);
+      var queue = QueueList.from([1, 2, 3]);
       expect(() {
         queue[3] = 4;
       }, throwsRangeError);
@@ -219,7 +219,7 @@
   group("throws a modification error for", () {
     var queue;
     setUp(() {
-      queue = new QueueList.from([1, 2, 3]);
+      queue = QueueList.from([1, 2, 3]);
     });
 
     test("add", () {
@@ -254,7 +254,7 @@
   });
 
   test("cast does not throw on mutation when the type is valid", () {
-    var patternQueue = new QueueList<Pattern>()..addAll(['a', 'b']);
+    var patternQueue = QueueList<Pattern>()..addAll(['a', 'b']);
     var stringQueue = patternQueue.cast<String>();
     stringQueue.addAll(['c', 'd']);
     expect(
@@ -274,7 +274,7 @@
   });
 
   test("cast throws on mutation when the type is not valid", () {
-    QueueList<Object> stringQueue = new QueueList<String>();
+    QueueList<Object> stringQueue = QueueList<String>();
     var numQueue = stringQueue.cast<num>();
     expect(
       numQueue,
@@ -290,7 +290,7 @@
   });
 
   test("cast returns a new QueueList", () {
-    var queue = new QueueList<String>();
+    var queue = QueueList<String>();
     expect(queue.cast<Pattern>(), isNot(same(queue)));
   });
 }
@@ -300,12 +300,12 @@
 QueueList atCapacity() {
   // Use addAll because [new QueueList.from(List)] won't use the default initial
   // capacity of 8.
-  return new QueueList()..addAll([1, 2, 3, 4, 5, 6, 7]);
+  return QueueList()..addAll([1, 2, 3, 4, 5, 6, 7]);
 }
 
 /// Returns a queue whose internal tail has a lower index than its head.
 QueueList withInternalGap() {
-  var queue = new QueueList.from(<dynamic>[null, null, null, null, 1, 2, 3, 4]);
+  var queue = QueueList.from(<dynamic>[null, null, null, null, 1, 2, 3, 4]);
   for (var i = 0; i < 4; i++) {
     queue.removeFirst();
   }
@@ -318,4 +318,4 @@
 /// Returns a matcher that expects that a closure throws a
 /// [ConcurrentModificationError].
 final throwsConcurrentModificationError =
-    throwsA(new TypeMatcher<ConcurrentModificationError>());
+    throwsA(TypeMatcher<ConcurrentModificationError>());
diff --git a/test/union_set_controller_test.dart b/test/union_set_controller_test.dart
index 8c561d3..ff8c95a 100644
--- a/test/union_set_controller_test.dart
+++ b/test/union_set_controller_test.dart
@@ -10,14 +10,14 @@
   UnionSetController<int> controller;
   Set<int> innerSet;
   setUp(() {
-    innerSet = new Set.from([1, 2, 3]);
-    controller = new UnionSetController()..add(innerSet);
+    innerSet = Set.from([1, 2, 3]);
+    controller = UnionSetController()..add(innerSet);
   });
 
   test("exposes a union set", () {
     expect(controller.set, unorderedEquals([1, 2, 3]));
 
-    controller.add(new Set.from([3, 4, 5]));
+    controller.add(Set.from([3, 4, 5]));
     expect(controller.set, unorderedEquals([1, 2, 3, 4, 5]));
 
     controller.remove(innerSet);
@@ -27,7 +27,7 @@
   test("exposes a disjoint union set", () {
     expect(controller.set, unorderedEquals([1, 2, 3]));
 
-    controller.add(new Set.from([4, 5, 6]));
+    controller.add(Set.from([4, 5, 6]));
     expect(controller.set, unorderedEquals([1, 2, 3, 4, 5, 6]));
 
     controller.remove(innerSet);
diff --git a/test/union_set_test.dart b/test/union_set_test.dart
index d0437ff..6624e5f 100644
--- a/test/union_set_test.dart
+++ b/test/union_set_test.dart
@@ -10,7 +10,7 @@
   group("with an empty outer set", () {
     var set;
     setUp(() {
-      set = new UnionSet<int>(new Set());
+      set = UnionSet<int>(Set());
     });
 
     test("length returns 0", () {
@@ -42,11 +42,11 @@
   group("with multiple disjoint sets", () {
     var set;
     setUp(() {
-      set = new UnionSet.from([
-        new Set.of([1, 2]),
-        new Set.of([3, 4]),
-        new Set.of([5]),
-        new Set()
+      set = UnionSet.from([
+        Set.of([1, 2]),
+        Set.of([3, 4]),
+        Set.of([5]),
+        Set()
       ], disjoint: true);
     });
 
@@ -81,11 +81,11 @@
   group("with multiple overlapping sets", () {
     var set;
     setUp(() {
-      set = new UnionSet.from([
-        new Set.of([1, 2, 3]),
-        new Set.of([3, 4]),
-        new Set.of([5, 1]),
-        new Set()
+      set = UnionSet.from([
+        Set.of([1, 2, 3]),
+        Set.of([3, 4]),
+        Set.of([5, 1]),
+        Set()
       ]);
     });
 
@@ -108,17 +108,17 @@
     });
 
     test("lookup() returns the first element in an ordered context", () {
-      var duration1 = new Duration(seconds: 0);
-      var duration2 = new Duration(seconds: 0);
+      var duration1 = Duration(seconds: 0);
+      var duration2 = Duration(seconds: 0);
       expect(duration1, equals(duration2));
       expect(duration1, isNot(same(duration2)));
 
-      var set = new UnionSet.from([
-        new Set.of([duration1]),
-        new Set.of([duration2])
+      var set = UnionSet.from([
+        Set.of([duration1]),
+        Set.of([duration2])
       ]);
 
-      expect(set.lookup(new Duration(seconds: 0)), same(duration1));
+      expect(set.lookup(Duration(seconds: 0)), same(duration1));
     });
 
     test("toSet() returns the union of all the sets", () {
@@ -134,10 +134,10 @@
   group("after an inner set was modified", () {
     var set;
     setUp(() {
-      var innerSet = new Set.of([3, 7]);
-      set = new UnionSet.from([
-        new Set.of([1, 2]),
-        new Set.of([5]),
+      var innerSet = Set.of([3, 7]);
+      set = UnionSet.from([
+        Set.of([1, 2]),
+        Set.of([5]),
         innerSet
       ]);
 
@@ -178,16 +178,16 @@
   group("after the outer set was modified", () {
     var set;
     setUp(() {
-      var innerSet = new Set.of([6]);
-      var outerSet = new Set.of([
-        new Set.of([1, 2]),
-        new Set.of([5]),
+      var innerSet = Set.of([6]);
+      var outerSet = Set.of([
+        Set.of([1, 2]),
+        Set.of([5]),
         innerSet
       ]);
 
-      set = new UnionSet<int>(outerSet);
+      set = UnionSet<int>(outerSet);
       outerSet.remove(innerSet);
-      outerSet.add(new Set.of([3, 4]));
+      outerSet.add(Set.of([3, 4]));
     });
 
     test("length returns the total length", () {
diff --git a/test/unmodifiable_collection_test.dart b/test/unmodifiable_collection_test.dart
index c7b539f..dcc0f3b 100644
--- a/test/unmodifiable_collection_test.dart
+++ b/test/unmodifiable_collection_test.dart
@@ -12,39 +12,39 @@
 
 main() {
   var list = <int>[];
-  testUnmodifiableList(list, new UnmodifiableListView(list), "empty");
+  testUnmodifiableList(list, UnmodifiableListView(list), "empty");
   list = [42];
-  testUnmodifiableList(list, new UnmodifiableListView(list), "single-42");
+  testUnmodifiableList(list, UnmodifiableListView(list), "single-42");
   list = [7];
-  testUnmodifiableList(list, new UnmodifiableListView(list), "single!42");
+  testUnmodifiableList(list, UnmodifiableListView(list), "single!42");
   list = [1, 42, 10];
-  testUnmodifiableList(list, new UnmodifiableListView(list), "three-42");
+  testUnmodifiableList(list, UnmodifiableListView(list), "three-42");
   list = [1, 7, 10];
-  testUnmodifiableList(list, new UnmodifiableListView(list), "three!42");
+  testUnmodifiableList(list, UnmodifiableListView(list), "three!42");
 
   list = [];
-  testNonGrowableList(list, new NonGrowableListView(list), "empty");
+  testNonGrowableList(list, NonGrowableListView(list), "empty");
   list = [42];
-  testNonGrowableList(list, new NonGrowableListView(list), "single-42");
+  testNonGrowableList(list, NonGrowableListView(list), "single-42");
   list = [7];
-  testNonGrowableList(list, new NonGrowableListView(list), "single!42");
+  testNonGrowableList(list, NonGrowableListView(list), "single!42");
   list = [1, 42, 10];
-  testNonGrowableList(list, new NonGrowableListView(list), "three-42");
+  testNonGrowableList(list, NonGrowableListView(list), "three-42");
   list = [1, 7, 10];
-  testNonGrowableList(list, new NonGrowableListView(list), "three!42");
+  testNonGrowableList(list, NonGrowableListView(list), "three!42");
 
-  var aSet = new Set<int>();
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "empty");
-  aSet = new Set();
+  var aSet = Set<int>();
+  testUnmodifiableSet(aSet, UnmodifiableSetView(aSet), "empty");
+  aSet = Set();
   testUnmodifiableSet(aSet, const UnmodifiableSetView.empty(), "const empty");
-  aSet = new Set.of([42]);
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "single-42");
-  aSet = new Set.of([7]);
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "single!42");
-  aSet = new Set.of([1, 42, 10]);
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "three-42");
-  aSet = new Set.of([1, 7, 10]);
-  testUnmodifiableSet(aSet, new UnmodifiableSetView(aSet), "three!42");
+  aSet = Set.of([42]);
+  testUnmodifiableSet(aSet, UnmodifiableSetView(aSet), "single-42");
+  aSet = Set.of([7]);
+  testUnmodifiableSet(aSet, UnmodifiableSetView(aSet), "single!42");
+  aSet = Set.of([1, 42, 10]);
+  testUnmodifiableSet(aSet, UnmodifiableSetView(aSet), "three-42");
+  aSet = Set.of([1, 7, 10]);
+  testUnmodifiableSet(aSet, UnmodifiableSetView(aSet), "three!42");
 }
 
 void testUnmodifiableList(List<int> original, List<int> wrapped, String name) {
@@ -312,7 +312,7 @@
 }
 
 void testNoWriteList(List<int> original, List<int> wrapped, String name) {
-  var copy = new List.of(original);
+  var copy = List.of(original);
 
   testThrows(name, thunk) {
     test(name, () {
@@ -336,16 +336,16 @@
 
   testThrows("$name - setRange throws", () {
     wrapped.setRange(
-        0, wrapped.length, new Iterable.generate(wrapped.length, (i) => i));
+        0, wrapped.length, Iterable.generate(wrapped.length, (i) => i));
   });
 
   testThrows("$name - setAll throws", () {
-    wrapped.setAll(0, new Iterable.generate(wrapped.length, (i) => i));
+    wrapped.setAll(0, Iterable.generate(wrapped.length, (i) => i));
   });
 }
 
 void testWriteList(List<int> original, List wrapped, String name) {
-  var copy = new List.of(original);
+  var copy = List.of(original);
 
   test("$name - []=", () {
     if (original.isNotEmpty) {
@@ -361,7 +361,7 @@
   });
 
   test("$name - sort", () {
-    List sortCopy = new List.of(original);
+    List sortCopy = List.of(original);
     sortCopy.sort();
     wrapped.sort();
     expect(original, orderedEquals(sortCopy));
@@ -393,7 +393,7 @@
 
 void testNoChangeLengthList(
     List<int> original, List<int> wrapped, String name) {
-  var copy = new List.of(original);
+  var copy = List.of(original);
 
   void testThrows(String name, thunk) {
     test(name, () {
@@ -457,7 +457,7 @@
 }
 
 void testReadSet(Set<int> original, Set<int> wrapped, String name) {
-  var copy = new Set.of(original);
+  var copy = Set.of(original);
 
   test("$name - containsAll", () {
     expect(wrapped.containsAll(copy), isTrue);
@@ -467,24 +467,23 @@
   });
 
   test("$name - intersection", () {
-    expect(wrapped.intersection(new Set()), isEmpty);
+    expect(wrapped.intersection(Set()), isEmpty);
     expect(wrapped.intersection(copy), unorderedEquals(original));
-    expect(wrapped.intersection(new Set.of([42])),
-        new Set.of(original.contains(42) ? [42] : []));
+    expect(wrapped.intersection(Set.of([42])),
+        Set.of(original.contains(42) ? [42] : []));
   });
 
   test("$name - union", () {
-    expect(wrapped.union(new Set()), unorderedEquals(original));
+    expect(wrapped.union(Set()), unorderedEquals(original));
     expect(wrapped.union(copy), unorderedEquals(original));
-    expect(wrapped.union(new Set.of([42])),
-        equals(original.union(new Set.of([42]))));
+    expect(wrapped.union(Set.of([42])), equals(original.union(Set.of([42]))));
   });
 
   test("$name - difference", () {
-    expect(wrapped.difference(new Set()), unorderedEquals(original));
+    expect(wrapped.difference(Set()), unorderedEquals(original));
     expect(wrapped.difference(copy), isEmpty);
-    expect(wrapped.difference(new Set.of([42])),
-        equals(original.difference(new Set.of([42]))));
+    expect(wrapped.difference(Set.of([42])),
+        equals(original.difference(Set.of([42]))));
   });
 }
 
@@ -590,7 +589,7 @@
 }
 
 testNoChangeMap(Map<int, int> original, Map<int, int> wrapped, String name) {
-  var copy = new Map.of(original);
+  var copy = Map.of(original);
 
   testThrows(name, thunk) {
     test(name, () {
@@ -609,11 +608,11 @@
   });
 
   testThrows("$name addAll throws", () {
-    wrapped.addAll(new Map()..[42] = 42);
+    wrapped.addAll(Map()..[42] = 42);
   });
 
   testThrows("$name addAll empty throws", () {
-    wrapped.addAll(new Map());
+    wrapped.addAll(Map());
   });
 
   testThrows("$name remove throws", () {
diff --git a/test/utils.dart b/test/utils.dart
index a97275e..dbeadc7 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -4,7 +4,7 @@
 
 import "package:test/test.dart";
 
-final Matcher throwsCastError = throwsA(new TypeMatcher<CastError>());
+final Matcher throwsCastError = throwsA(TypeMatcher<CastError>());
 
 /// A hack to determine whether we are running in a Dart 2 runtime.
 final bool isDart2 = _isTypeArgString('');
diff --git a/test/wrapper_test.dart b/test/wrapper_test.dart
index bb8f90f..643c441 100644
--- a/test/wrapper_test.dart
+++ b/test/wrapper_test.dart
@@ -66,7 +66,7 @@
   // don't override those and so the wrappers don't forward those.
 }
 
-final toStringInvocation = new Invocation.method(#toString, const []);
+final toStringInvocation = Invocation.method(#toString, const []);
 
 // InvocationCheckers with types Queue, Set, List or Iterable to allow them as
 // argument to DelegatingIterable/Set/List/Queue.
@@ -95,38 +95,37 @@
 // Expector that wraps in DelegatingIterable.
 class IterableExpector<T> extends Expector implements Iterable<T> {
   wrappedChecker(Invocation i) =>
-      new DelegatingIterable<T>(new IterableInvocationChecker<T>(i));
+      DelegatingIterable<T>(IterableInvocationChecker<T>(i));
 }
 
 // Expector that wraps in DelegatingList.
 class ListExpector<T> extends Expector implements List<T> {
   wrappedChecker(Invocation i) =>
-      new DelegatingList<T>(new ListInvocationChecker<T>(i));
+      DelegatingList<T>(ListInvocationChecker<T>(i));
 }
 
 // Expector that wraps in DelegatingSet.
 class SetExpector<T> extends Expector implements Set<T> {
-  wrappedChecker(Invocation i) =>
-      new DelegatingSet<T>(new SetInvocationChecker<T>(i));
+  wrappedChecker(Invocation i) => DelegatingSet<T>(SetInvocationChecker<T>(i));
 }
 
 // Expector that wraps in DelegatingSet.
 class QueueExpector<T> extends Expector implements Queue<T> {
   wrappedChecker(Invocation i) =>
-      new DelegatingQueue<T>(new QueueInvocationChecker<T>(i));
+      DelegatingQueue<T>(QueueInvocationChecker<T>(i));
 }
 
 // Expector that wraps in DelegatingMap.
 class MapExpector<K, V> extends Expector implements Map<K, V> {
   wrappedChecker(Invocation i) =>
-      new DelegatingMap<K, V>(new MapInvocationChecker<K, V>(i));
+      DelegatingMap<K, V>(MapInvocationChecker<K, V>(i));
 }
 
 // Utility values to use as arguments in calls.
 Null func0() => null;
 Null func1(Object x) => null;
 Null func2(Object x, Object y) => null;
-var val = new Object();
+var val = Object();
 
 void main() {
   testIterable(var expect) {
@@ -212,7 +211,7 @@
 
   void testSet(var expect) {
     testIterable(expect);
-    Set set = new Set();
+    Set set = Set();
     (expect..add(val)).equals.add(val);
     (expect..addAll([val])).equals.addAll([val]);
     (expect..clear()).equals.clear();
@@ -240,7 +239,7 @@
   }
 
   void testMap(var expect) {
-    Map map = new Map();
+    Map map = Map();
     (expect..[val]).equals[val];
     (expect..[val] = val).equals[val] = val;
     (expect..addAll(map)).equals.addAll(map);
@@ -393,7 +392,7 @@
       });
 
       test(".toSet", () {
-        expect(set.toSet(), equals(new Set.from(["foo", "bar"])));
+        expect(set.toSet(), equals(Set.from(["foo", "bar"])));
       });
 
       test(".where", () {
@@ -411,40 +410,40 @@
       });
 
       test(".difference", () {
-        expect(set.difference(new Set.from(["foo", "baz"])),
-            equals(new Set.from(["bar"])));
+        expect(set.difference(Set.from(["foo", "baz"])),
+            equals(Set.from(["bar"])));
       });
 
       test(".intersection", () {
-        expect(set.intersection(new Set.from(["foo", "baz"])),
-            equals(new Set.from(["foo"])));
+        expect(set.intersection(Set.from(["foo", "baz"])),
+            equals(Set.from(["foo"])));
       });
 
       test(".union", () {
-        expect(set.union(new Set.from(["foo", "baz"])),
-            equals(new Set.from(["foo", "bar", "baz"])));
+        expect(set.union(Set.from(["foo", "baz"])),
+            equals(Set.from(["foo", "bar", "baz"])));
       });
     });
   }
 
   test("Iterable", () {
-    testIterable(new IterableExpector());
+    testIterable(IterableExpector());
   });
 
   test("List", () {
-    testList(new ListExpector());
+    testList(ListExpector());
   });
 
   test("Set", () {
-    testSet(new SetExpector());
+    testSet(SetExpector());
   });
 
   test("Queue", () {
-    testQueue(new QueueExpector());
+    testQueue(QueueExpector());
   });
 
   test("Map", () {
-    testMap(new MapExpector());
+    testMap(MapExpector());
   });
 
   group("MapKeySet", () {
@@ -452,8 +451,8 @@
     Set<String> set;
 
     setUp(() {
-      map = new Map<String, int>();
-      set = new MapKeySet<String>(map);
+      map = Map<String, int>();
+      set = MapKeySet<String>(map);
     });
 
     testTwoElementSet(() {
@@ -520,9 +519,9 @@
     Set<String> set;
 
     setUp(() {
-      map = new Map<String, String>();
-      set = new MapValueSet<String, String>(
-          map, (string) => string.substring(0, 1));
+      map = Map<String, String>();
+      set =
+          MapValueSet<String, String>(map, (string) => string.substring(0, 1));
     });
 
     testTwoElementSet(() {
@@ -629,12 +628,12 @@
     });
 
     test(".retainAll respects an unusual notion of equality", () {
-      map = new HashMap<String, String>(
+      map = HashMap<String, String>(
           equals: (value1, value2) =>
               value1.toLowerCase() == value2.toLowerCase(),
           hashCode: (value) => value.toLowerCase().hashCode);
-      set = new MapValueSet<String, String>(
-          map, (string) => string.substring(0, 1));
+      set =
+          MapValueSet<String, String>(map, (string) => string.substring(0, 1));
 
       map["f"] = "foo";
       map["B"] = "bar";
