Я ищу способ создать коллекцию, список, набор или карту, которая содержит преобразованные элементы оригинальной коллекции и отражает все изменения в этой коллекции.
Например, если у меня есть List<Integer>
от стороннего API, а другой API ожидает List<String>
. Я знаю, что могу преобразовать список следующим образом:
List<Integer> intList = thirdPartyBean.getIntListProperty();
List<String> stringList = intList.stream().map(Integer::toString)
.collect(Collectors.toList());
secondBean.setStringListProperty(stringList);
Проблема в том, что если что-то изменится в одном из списков, другой будет по-прежнему отражать предыдущее состояние. Предположим, что intList
содержит [1, 2, 3]
:
intList.add(4);
stringList.remove(0);
System.out.println(intList.toString()); // will print: [1, 2, 3, 4]
System.out.println(stringList.toString()); // will print: [2, 3]
// Expected result of both toString(): [2, 3, 4]
Поэтому я ищу что-то вроде List.sublist(from, to)
где результат "поддерживается" исходным списком.
Я думаю о реализации моей собственной обертки списка, которая используется следующим образом:
List<String> stringList = new MappedList<>(intList, Integer::toString, Integer::valueOf);
Вторая лямбда - для инвертирования преобразования, для поддержки вызовов вроде stringList.add(String)
.
Но прежде чем я сам это реализую, я хотел бы знать, пытаюсь ли я заново изобрести колесо - может быть, уже есть общее решение этой проблемы?