在流-流连接操作中,如果没有指定相等谓词,会出现编译时错误。但是可以使用 Join
方法来指定相等谓词。
下面是一个示例代码,演示了如何使用 Join
方法解决这个问题:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamJoinExample {
public static void main(String[] args) {
List persons = List.of(
new Person("John", 25),
new Person("Mary", 30),
new Person("Tom", 35)
);
List cars = List.of(
new Car("Toyota", "John"),
new Car("BMW", "Mary"),
new Car("Honda", "Tom")
);
Map personCarMap = persons.stream()
.flatMap(person -> cars.stream()
.filter(car -> car.getOwner().equals(person.getName()))
.map(car -> Map.entry(person.getName(), car.getBrand())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(personCarMap);
}
static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
static class Car {
private String brand;
private String owner;
public Car(String brand, String owner) {
this.brand = brand;
this.owner = owner;
}
public String getBrand() {
return brand;
}
public String getOwner() {
return owner;
}
}
}
在上面的示例中,我们有一个 Person
类和一个 Car
类,Person
类有一个名字和年龄属性,Car
类有一个品牌和车主属性。
我们想要通过车主的名字将 persons
流与 cars
流连接起来,并以车主的名字作为 key,车的品牌作为 value,构建一个 personCarMap
。
为了实现这个目标,我们使用了 flatMap
方法将 persons
流与 cars
流连接在一起,然后使用 filter
方法过滤出属于每个人的车辆,再使用 map
方法将车主的名字和车的品牌映射为一个 Map.Entry
对象。
最后,我们使用 collect
方法将所有的 Map.Entry
对象收集到一个 Map
中。
输出结果为:{John=Toyota, Mary=BMW, Tom=Honda}
。
上一篇:不支持没有回调函数的API。