private List<KeyValueResult> searchAnyRankAnyChampWithItems(int itemCount, byte[] items) {
    List<KeyValueResult> results = new ArrayList<>();
    stats.forEach(
        (long key, int value) -> {
          KeyValueResult result = satisfies(key, itemCount, items);
          if (result != null) {
            populate(value, result);
            results.add(result);
          }
        });

    return results;
  }
  private List<KeyValueResult> searchWithRankAnyChampAnyItems(byte rank, int itemCount) {
    List<KeyValueResult> results = new ArrayList<>();
    stats.forEach(
        (long key, int value) -> {
          if (rankMismatch(rank, key)) {
            return;
          }

          KeyValueResult result = satisfies(key, itemCount);
          if (result == null) {
            return;
          }

          populate(value, result);
          results.add(result);
        });

    return results;
  }
  private List<KeyValueResult> searchAnyRankWithChampWithItems(
      byte champId, int itemCount, byte[] items) {
    List<KeyValueResult> results = new ArrayList<>();
    stats.forEach(
        (long key, int value) -> {
          if (champMismatch(champId, key)) {
            return;
          }

          KeyValueResult result = satisfies(key, itemCount, items);
          if (result == null) {
            return;
          }

          populate(value, result);
          results.add(result);
        });

    return results;
  }
  private int getValue(byte rank, byte champId, byte[] items) {
    long key =
        ByteUtils.encode(rank, champId, items[0], items[1], items[2], items[3], items[4], items[5]);

    return stats.get(key, Integer.MAX_VALUE);
  }
 public void forEach(LongIntConsumer consumer) {
   stats.forEach(consumer);
 }