code: public static Date copyWith(Date self, Map<Object, Integer> updates) {
          Calendar cal = Calendar.getInstance();
          cal.setTime(self);
          set(cal, updates);
          return cal.getTime();
      }
docs: Support creating a new Date having similar properties to
  an existing Date (which remains unaltered) but with
  some fields updated according to a Map of changes.
  <p>
  Example usage:
  <pre>
  import static java.util.Calendar.YEAR
  def today = new Date()
  def nextYear = today[YEAR] + 1
  def oneYearFromNow = today.copyWith(year: nextYear)
  println today
  println oneYearFromNow
  </pre>
  
  @param self    A Date
  @param updates A Map of Calendar keys and values
  @return The newly created Date
  @see java.util.Calendar#set(int, int)
  @see #set(java.util.Date, java.util.Map)
  @see #copyWith(java.util.Calendar, java.util.Map)
  @since 2.2.0