class FieldNormalizer implements Normalizer<T> {

    @Override
    public List<T> normalize(List<T> objectsToNormalize) {
        var distinctValues = getDistinctFieldValues(objectsToNormalize);

        var normalizedLobMap = distinctValues.stream()
                .collect(Collectors.toMap(
                        Function.identity(),
                        distinctValue -> RootTermDistanceCalculator.nearestRootTerm(fieldDistanceCalculators, distinctValue, 7)
                ));

        return objectsToNormalize.parallelStream()
                .map(objToNormalize -> {
                    var currentLob = getFieldValue(objToNormalize);

                    if(currentLob != null) {
                        var normalizedLob = normalizedLobMap.get(currentLob);

                        return setNormalizedFieldValue(objToNormalize, normalizedLob);
                    }

                    return objToNormalize;
                })
        .collect(Collectors.toList());
    }

    protected  FieldNormalizer(Set<RootTermDistanceCalculator> fieldDistanceCalculators);

}