private <T extends TypeValue> List<T> sortTypes(List<T> list, Map<T, Integer> map) {
    List<T> sortedList = new ArrayList<>();
    sortedList.addAll(list);

    sortedList.sort(
        (o1, o2) -> {
          Integer o1Count = map.get(o1);
          Integer o2Count = map.get(o2);
          if (o1Count != null || o2Count != null) {
            if (o1Count == null || ApplicationProperties.EMPTY.equals(o1.getCode())) return -1;
            if (o2Count == null || ApplicationProperties.EMPTY.equals(o2.getCode())) return 1;
            return o2Count.compareTo(o1Count);
          }
          return o1.getName().compareTo(o2.getName());
        });

    return sortedList;
  }
 /**
  * Проверяет наличие объекта в списке
  *
  * @param value объект, который проверяется на вхождение
  * @param values список в котором проверяется наличие объекта
  * @return {true} - если объект <code>value</code> пуст или его код равен <code>EMPTY</code> или
  *     если этот объект есть в списке
  */
 private boolean checkValue(TypeValue value, List<TypeValue> values) {
   return values == null
       || values.isEmpty()
       || (values.size() == 1 && ApplicationProperties.EMPTY.equals((values.get(0)).getCode()))
       || values.contains(value);
 }