基本上,我得到了一个包含位置列表的企鹅数据流,每个位置都有一个ID,该ID指向哪个企鹅访问了该位置。然后,我想返回一个企鹅对象流,其中每个对象都包含该企鹅的ID和该企鹅去过的所有位置的列表。
我的方法是先创建一个包含所有ID的新Stream,然后遍历原始流,并将每个位置(地理位置)添加到具有相同ID的列表中,然后创建一个具有所有geos的企鹅对象并添加到企鹅列表,然后对IDstream中的每个ID重复此操作。 到目前为止,这就是我的代码:
public static Stream<Penguin> getDataByTrackId(Stream<PenguinData> stream) {
List<Geo> geo = new ArrayList<>();
List<Penguin> result=new ArrayList<>();
List<String> IDs=new ArrayList<>();
Supplier<Stream<PenguinData>> streamSupplier= () -> stream;
//create stream with all trackIDs
Iterator<PenguinData> itr=streamSupplier.get().iterator();
while (itr.hasNext()==true) {
IDs.add(((PenguinData)itr.next()).trackID);
}
Stream<String> tempStream=IDs.stream().distinct();
Supplier<Stream<String>> idStreamSupplier = () -> tempStream;
//iterate through stream, create list with all locations (geo),
//then create penguin object with these locations and add them to a list
itr=streamSupplier.get().iterator();
String tempString;
Iterator<String> iter=idStreamSupplier.get().iterator();
Iterator<String> iter2=idStreamSupplier.get().iterator();
Iterator<PenguinData> iter8=streamSupplier.get().iterator();
Iterator<PenguinData> iter9=streamSupplier.get().iterator();
while (iter.hasNext()==true) {
tempString=(String)iter.next();
while (itr.hasNext()==true) {
if (((PenguinData)itr.next()).trackID==tempString) {
Geo tempGeo=new Geo(((PenguinData)iter8.next()).latitude, ((PenguinData)iter9.next()).longitude);
geo.add(tempGeo);
}
}
Penguin tempPenguin=new Penguin(geo, iter2.next());
result.add(tempPenguin);
geo=new ArrayList<>();
}
return result.stream();
}
我知道这不是最漂亮的代码,我甚至不确定它是否最终可以工作,但是现在我在“ itr = streamSupplier.get()。iterator();”处收到一个IllegalStateException。老实说,我不知道为什么会这样,也没有在网上找到任何东西。 (另外,如果可以重复使用迭代器,请告诉我,我只创建了很多迭代器。)