При условии, что они реализуют некоторый общий интерфейс (это облегчит задачу, особенно при кастинге), тогда это относительно просто.
Он все еще O (nm), так как вам нужно пройти оба длины списка, чтобы найти элементы для добавления.
public interface JoinInterface {
int getId();
int getObject1Id(); // likely baggage here
}
public static List<? extends JoinableEntity> leftJoin(List<? extends JoinableEntity> left,
List<? extends JoinableEntity> right) {
List<JoinableEntity> result = new ArrayList<>();
result.addAll(left);
for(JoinableEntity aLeft : left) {
for(JoinableEntity aRight : right) {
if(aLeft.getId() == aRight.getObject1Id()) {
result.add(aRight);
break;
}
}
}
return result;
}