class Container implements ExperimentalObject {

    @Override
    public int hashCode () {
        List<Field> identifyingFields = getIdentifyingFields();
        AtomicInteger result = new AtomicInteger(0);
        identifyingFields.stream()
                         .map(field -> {
                             try {
                                 return field.get(this);
                             } catch (IllegalAccessException e) {
                                 log.error("Caught IllegalAccessException while evaluating hashcode", e);
                                 return null;
                             }
                         })
                         .mapToInt(o -> Optional.ofNullable(o).map(Object::hashCode).orElse(0))
                         .forEachOrdered(i -> result.set(result.get() * 31 + i));
        return result.get();
    }

}