code: public CompletableFuture<List<ByteArraySegment>> get(@NonNull List<ByteArraySegment> keys, @NonNull Duration timeout) {
          if (keys.size() == 1) {
              // Shortcut for single key.
              return get(keys.get(0), timeout).thenApply(Collections::singletonList);
          }
  
          // Lookup all the keys in parallel, and make sure to apply their resulting values in the same order that their keys
          // where provided to us.
          ensureInitialized();
          TimeoutTimer timer = new TimeoutTimer(timeout);
          PageCollection pageCollection = new PageCollection(this.state.get().length);
          val gets = keys.stream()
                  .map(key -> locatePage(key, pageCollection, timer)
                          .thenApplyAsync(page -> page.getPage().searchExact(key), this.executor))
                  .collect(Collectors.toList());
          return Futures.allOfWithResults(gets);
      }
docs: Looks up the value of multiple keys.
  
  @param keys    A list of ByteArraySegments representing the keys to look up.
  @param timeout Timeout for the operation.
  @return A CompletableFuture that, when completed normally, will contain a List with ByteArraySegments representing
  the values associated with the given keys. The values in this list will be in the same order as the given Keys, so
  they can be matched to their sought keys by their index. If the operation failed, the Future
  will be completed with the appropriate exception.