code: @NonNull
      public Transition setMatchOrder(@Nullable int... matches) {
          if (matches == null || matches.length == 0) {
              mMatchOrder = DEFAULT_MATCH_ORDER;
          } else {
              for (int i = 0; i < matches.length; i++) {
                  int match = matches[i];
                  if (!isValidMatch(match)) {
                      throw new IllegalArgumentException("matches contains invalid value");
                  }
                  if (alreadyContains(matches, i)) {
                      throw new IllegalArgumentException("matches contains a duplicate value");
                  }
              }
              mMatchOrder = matches.clone();
          }
          return this;
      }
docs: Sets the order in which Transition matches View start and end values.
  <p>
  The default behavior is to match first by {@link android.view.View#getTransitionName()},
  then by View instance, then by {@link android.view.View#getId()} and finally
  by its item ID if it is in a direct child of ListView. The caller can
  choose to have only some or all of the values of {@link #MATCH_INSTANCE},
  {@link #MATCH_NAME}, {@link #MATCH_ITEM_ID}, and {@link #MATCH_ID}. Only
  the match algorithms supplied will be used to determine whether Views are the
  the same in both the start and end Scene. Views that do not match will be considered
  as entering or leaving the Scene.
  </p>
  @param matches A list of zero or more of {@link #MATCH_INSTANCE},
  {@link #MATCH_NAME}, {@link #MATCH_ITEM_ID}, and {@link #MATCH_ID}.
  If none are provided, then the default match order will be set.
  @return This transition object.