Как объединить 2 списка стримом так, чтобы итоговый результат включал в себя одни параметры из первого списка, а другие из второго списка?
var collectionOfElements = Stream.concat(highs.stream(), lows.stream())
                .collect(Collectors.toMap(MyObject::id, Function.identity(), (o1, o2) -> {
                    return ... // TODO :: merge two objects;
                })).values();

Объединяете два стрима и превращаете в мапу. Там три аргумента возможны: функция для key, для value, и то, что вам нужно, функция объединяющая элементы при совпадении ключей.
Останется у этой мапы отбросить ключи - останется коллекция объединенных значений.
М.б. так?
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

public class test {

  public static void main(String[] args) {
    List<Item> listA = new ArrayList<>();
    List<Item> listB = new ArrayList<>();

    List<Item> coupled = couple(listA, listB);

  }

  static List<Item> couple(List<Item> listA, List<Item> listB){
    return listA.stream()
      .peek(itemA -> {
        Item complimentary = listB.stream().filter(itemB -> itemB.getId() == itemA.getId()).findFirst().orElse(null);
        if (complimentary == null) throw new IllegalArgumentException("Can't find pair");
        itemA.setLow(complimentary.getLow());
      })
      .toList();
  }
}


@Getter
@Setter
class Item{
  private int id;
  private int low;
  private int high;
}

НО! Если элементов много то быстродействие будет ни к чёрту :)