code: public void putAll(BloomFilter<T> that) {
          N.checkArgNotNull(that);
          N.checkArgument(this != that, "Cannot combine a BloomFilter with itself.");
          N.checkArgument(this.numHashFunctions == that.numHashFunctions, "BloomFilters must have the same number of hash functions (%s != %s)",
                  this.numHashFunctions, that.numHashFunctions);
          N.checkArgument(this.bitSize() == that.bitSize(), "BloomFilters must have the same size underlying bit arrays (%s != %s)", this.bitSize(),
                  that.bitSize());
          N.checkArgument(this.strategy.equals(that.strategy), "BloomFilters must have equal strategies (%s != %s)", this.strategy, that.strategy);
          N.checkArgument(this.funnel.equals(that.funnel), "BloomFilters must have equal funnels (%s != %s)", this.funnel, that.funnel);
          this.bits.putAll(that.bits);
      }
docs: Combines this bloom filter with another bloom filter by performing a bitwise OR of the
  underlying data. The mutations happen to <b>this</b> instance. Callers must ensure the bloom
  filters are appropriately sized to avoid saturating them.
  
  @param that The bloom filter to combine this bloom filter with. It is not mutated.
  @throws IllegalArgumentException if {@code isCompatible(that) == false}
  
  @since 15.0