docs: private void useRoundRobinLists(
        List<DropEntry> newDropList, List<BackendAddressGroup> newBackendAddrList,
        @Nullable GrpclbClientLoadRecorder loadRecorder) {
      logger.log(
          ChannelLogLevel.INFO, "Using RR list={0}, drop={1}", newBackendAddrList, newDropList);
      HashMap<List<EquivalentAddressGroup>, Subchannel> newSubchannelMap =
          new HashMap<>();
      List<BackendEntry> newBackendList = new ArrayList<>();
  
      switch (mode) {
        case ROUND_ROBIN:
          for (BackendAddressGroup backendAddr : newBackendAddrList) {
            EquivalentAddressGroup eag = backendAddr.getAddresses();
            List<EquivalentAddressGroup> eagAsList = Collections.singletonList(eag);
            Subchannel subchannel = newSubchannelMap.get(eagAsList);
            if (subchannel == null) {
              subchannel = subchannels.get(eagAsList);
              if (subchannel == null) {
                subchannel = subchannelPool.takeOrCreateSubchannel(
                    eag, createSubchannelAttrs(), this);
                subchannel.requestConnection();
              }
              newSubchannelMap.put(eagAsList, subchannel);
            }
            BackendEntry entry;
            // Only picks with tokens are reported to LoadRecorder
            if (backendAddr.getToken() == null) {
              entry = new BackendEntry(subchannel);
            } else {
              entry = new BackendEntry(subchannel, loadRecorder, backendAddr.getToken());
            }
            newBackendList.add(entry);
          }
          // Close Subchannels whose addresses have been delisted
          for (Entry<List<EquivalentAddressGroup>, Subchannel> entry : subchannels.entrySet()) {
            List<EquivalentAddressGroup> eagList = entry.getKey();
            if (!newSubchannelMap.containsKey(eagList)) {
              subchannelPool.returnSubchannel(entry.getValue());
            }
          }
          subchannels = Collections.unmodifiableMap(newSubchannelMap);
          break;
        case PICK_FIRST:
          List<EquivalentAddressGroup> eagList = new ArrayList<>();
          // Because for PICK_FIRST, we create a single Subchannel for all addresses, we have to
          // attach the tokens to the EAG attributes and use TokenAttachingLoadRecorder to put them on
          // headers.
          //
          // The PICK_FIRST code path doesn't cache Subchannels.
          for (BackendAddressGroup bag : newBackendAddrList) {
            EquivalentAddressGroup origEag = bag.getAddresses();
            Attributes eagAttrs = origEag.getAttributes();
            if (bag.getToken() != null) {
              eagAttrs = eagAttrs.toBuilder()
                  .set(GrpclbConstants.TOKEN_ATTRIBUTE_KEY, bag.getToken()).build();
            }
            eagList.add(new EquivalentAddressGroup(origEag.getAddresses(), eagAttrs));
          }
          Subchannel subchannel;
          if (subchannels.isEmpty()) {
            subchannel =
                helper.createSubchannel(CreateSubchannelArgs.newBuilder()
                    .setAddresses(eagList)
                    .setAttributes(createSubchannelAttrs())
                    .setStateListener(this)
                    .build());
          } else {
            checkState(subchannels.size() == 1, "Unexpected Subchannel count: %s", subchannels);
            subchannel = subchannels.values().iterator().next();
            helper.updateSubchannelAddresses(subchannel, eagList);
          }
          subchannels = Collections.singletonMap(eagList, subchannel);
          newBackendList.add(
              new BackendEntry(subchannel, new TokenAttachingTracerFactory(loadRecorder)));
          break;
        default:
          throw new AssertionError("Missing case for " + mode);
      }
  
      dropList = Collections.unmodifiableList(newDropList);
      backendList = Collections.unmodifiableList(newBackendList);
    }