Просто сохраните значения замены на карте (с кодом в качестве ключа), а затем переберите list1, чтобы изменить его, где это необходимо.
Map<String, String> replaceValues = list2.stream()
.collect(Collectors.toMap(x -> x.code, x -> x.tobereplace));
list1.stream
.filter(x -> replaceValues.containsKey(x.code))
.forEach(x -> x.tobereplace = replaceValues.get(x.code));
EDIT
Как указывает Жозеюан в комментариях, Collectors.toMap
сгенерирует исключение, если list2 содержит повторяющиеся значения. ОП на самом деле не указывает, что делать в этом случае, но решение использует функцию слияния в Collectors.toMap
.
Это будет использовать первый элемент, с которым он сталкивается с любым данным кодом:
Map<String, String> replaceValues = list2.stream()
.collect(Collectors.toMap(x -> x.code, x -> x.tobereplace, (x1, x2) -> x1));
Политика слияния может быть любой, например, использовать первый элемент с непустым значением, например,
Если известно, что в списке нет дубликатов, используйте набор вместо списка. Это прояснит ситуацию для каждого, кто читает код, и поможет избежать ненужных проверок.