Вы можете создать свой собственный элемент управления, который наследуется от текстового поля, но после каждого символа вы заменяете его символом *, сохраняя истинное значение в частной переменной на странице. Используя флажок, вы можете переключить, показывает ли значение в текстовом поле истинное значение или значение *.
Это не изящное решение, и это не лучшая практика, но я думаю, что это еще альтернатива, если вы готовы жить с ним.
Кажется, что parent.id < child.id
выполняется, то есть: родитель создается первым. Хотя это и не обязательно, иногда это может облегчить ситуацию.
Здесь это не нужно.
public void processData(List<Category> categoryList) {
Map<String, CategoryTree> map = categoryList.collect(
Collectors.toMap(cat -> cat.id,
cat -> new CategoryTree(id, name)));
List<CategoryTree> treeRoots = new ArrayList<>(); // Forrest if more than one root.
categoryList.forEach(cat -> {
CategoryTree node = map.get(cat.id);
if (cat.parentId != null) {
CategoryTree parent = map.get(cat.parentId)
parent.children.add(node );
} else {
treeRoots.add(node );
}
});
List<CategoryTree> roleObjectList = new ArrayList<>(map.values());
...
Хотя, возможно, быстрее, чем алгоритм следования по пути (который может использовать порядок идентификаторов), ему требуется дополнительная память: дополнительная карта.