Собираем из коллекции Map, в которой key - это id, а value - сам объект. Коллектор третьим аргументом принимает merge-функцию:
var productListWithUrlName = new ArrayList<Product>();
var productListWithPrice = new ArrayList<Product>();
var mergedProducts = Stream.concat(productListWithPrice.stream(), productListWithUrlName.stream()) // Объединяем коллекции
.collect(Collectors.toMap(Product::id, Function.identity(), (product1, product2) -> mergeProducts(product1, product2)));
Остается реализовать метод mergeProducts, который будет объединять два Product и возвращать результат.
private Product mergeProducts(Product product1, Product product2) {
// TODO :: реализовать объединение двух Product
}