首页 > 解决方案 > 是否可以加入两个 Java 8 流?

问题描述

我想知道我是否可以加入两个预先排序的流(一次通过)。例如,如果我有以下 Java 类:

public class Person { // constructor & getters ommitted
  private String name;
  private int salary;
  private List<Car> cars;
  public void addCar(Car c) { cars.add(c); }
}

public class Car { // constructor & getters ommitted
  private String owner;
  private String brand;
}

我有预先排序的流,如:

Stream<Person> clients = Arrays.asList(
  new Person("Anne", 500), 
  new Person("Johnny", 340)
  ).stream();

Stream<Car> cars = Arrays.asList(
  new Car("Johnny", "Mazda"), 
  new Car("Johnny", "Fiat"), 
  new Car("Mary", "Volvo")
  ).stream();

我想addCar()用“马自达”和“菲亚特”向约翰尼申请。安妮没有车,玛丽也不是客户。

是否可以通过单次流加入两个流?

我已经看到过多次遍历一条流的解决方案,但由于它们是预先订购的,我想可能有机会一次性完成。

编辑:操作的预期结果是调用addCar()“Johnny”两次:一次是“Mazda”,一次是“Fiat”。

标签: javajava-8java-stream

解决方案


恐怕无法使用 Stream API 有效地解决此任务。但是你仍然可以使用迭代器来做到这一点。

public static void addCars(Stream<Person> clients, Stream<Car> cars) {
    Iterator<Person> clientsIt = clients.iterator();
    Iterator<Car> carsIt = cars.iterator();
    Person client = null;
    while (carsIt.hasNext()) {
        Car car = carsIt.next();
        while (client == null || !client.getName().equals(car.getOwner())) {
            if(!clientsIt.hasNext()) return;
            client = clientsIt.next();
        }
        client.addCar(car);
    }
}

推荐阅读