### Question:
Hasher { public Hasher putAll(Iterable<? extends Hashable> hashables) { Optional.ofNullable(hashables) .ifPresent(this::hashAll); return this; }  static Hasher of(HashFunction function); HashCode hash(); Hasher put(Hashable hashable); Hasher putAll(Iterable<? extends Hashable> hashables); Hasher putBoolean(boolean b); Hasher putByte(byte b); Hasher putBytes(byte[] bytes); Hasher putChar(char c); Hasher putClass(Class<?> type); Hasher putDouble(double d); Hasher putFloat(float f); Hasher putInt(int i); Hasher putLong(long l); Hasher putShort(short s); Hasher putUnencodedChars(CharSequence charSequence);  }### Answer:
@Test public void testPutAll() { assertThat(Hasher.of(HASH_FUNCTION) .putAll(Arrays.asList(new TestHashable(0), new TestHashable(1))) .putAll(Collections.singletonList(new TestHashable(2))) .hash()).isEqualTo(HASH_FUNCTION.newHasher().putInt(0).putInt(1).putInt(2).hash()); }