我有以下两个类和功能:
public static class Shop {
public int id;
public String name;
public List<Coordinate> coordinates = new ArrayList<>();
@Override
public String toString() {
String str = id + " (" + name + ") [ ";
for (Coordinate coordinate : coordinates) {
str += (coordinate.toString() + " ");
}
str += "]";
return str;
}
}
public static class Coordinate {
public String latitude;
public String longitude;
public Coordinate(String latitude, String longitude) {
this.latitude = latitude;
this.longitude = longitude;
}
@Override
public String toString() {
return "{" + latitude + ", " + longitude + "}";
}
}
public List<String[]> longTimeFunc() {
try {
//simulate load
Thread.sleep(1000);
} catch (InterruptedException ignore) {
}
Log.d("RX_TAG_LONG_LOAD", Thread.currentThread().getName());
return Arrays.asList(
new String[] {"1", "Foo", "lat1-1", "long1-1"},
new String[] {"1", "Foo", "lat1-2", "long1-2"},
new String[] {"2", "Bar", "lat2-1", "long2-1"},
new String[] {"1", "Foo", "lat1-3", "long1-3"},
new String[] {"1", "Foo", "lat1-4", "long1-4"},
new String[] {"3", "Ping", "lat3-1", "long3-1"},
new String[] {"2", "Bar", "lat2-2", "long2-2"},
new String[] {"1", "Foo", "lat1-5", "long1-5"},
new String[] {"2", "Bar", "lat2-3", "long2-3"},
new String[] {"2", "Bar", "lat2-4", "long2-4"},
new String[] {"1", "Foo", "lat1-6", "long1-6"},
new String[] {"1", "Foo", "lat1-7", "long1-7"},
new String[] {"3", "Ping", "lat3-2", "long3-2"},
new String[] {"3", "Ping", "lat3-3", "long3-3"},
new String[] {"2", "Bar", "lat2-5", "long2-5"},
new String[] {"3", "Ping", "lat3-4", "long3-4"},
new String[] {"2", "Bar", "lat2-6", "long2-6"},
new String[] {"3", "Ping", "lat3-5", "long3-5"},
new String[] {"2", "Bar", "lat2-7", "long2-7"},
new String[] {"2", "Bar", "lat2-8", "long2-8"},
new String[] {"3", "Ping", "lat3-6", "long3-6"},
new String[] {"2", "Bar", "lat2-9", "long2-9"},
new String[] {"3", "Ping", "lat3-7", "long3-7"},
new String[] {"2", "Bar", "lat2-10", "long2-10"},
new String[] {"2", "Bar", "lat2-11", "long2-11"},
new String[] {"4", "Dev", "lat4-1", "long4-1"},
new String[] {"4", "Dev", "lat4-2", "long4-2"},
new String[] {"4", "Dev", "lat4-3", "long4-3"},
new String[] {"4", "Dev", "lat4-4", "long4-4"},
new String[] {"4", "Dev", "lat4-5", "long4-5"}
);
}
我想按每行的第一个元素对源进行分组,并将它们收集到List<Shop>
:
Observable
.defer(() -> Observable.from(longTimeFunc()))
.doOnNext(strings -> Log.d("RX_TAG_FIRST", Arrays.toString(strings)))
.groupBy(rows -> rows[0])
.doOnNext(groupedObservable -> Log.d("RX_TAG_TWO", groupedObservable.getKey()))
.concatMap(group -> group.collect(Shop::new, (shop, rows) -> {
shop.id = Integer.parseInt(rows[0]);
shop.name = rows[1];
shop.coordinates.add(new Coordinate(rows[2], rows[3]));
}))
.doOnNext(shop -> Log.d("RX_TAG_THREE", String.valueOf(shop)))
.toList()
.doOnNext(shops -> Log.d("RX_TAG_FOUR", Thread.currentThread().getName()))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(shops -> Log.d("RX_TAG_SUBSCRIBE", String.valueOf(shops)));
Log.d("RX_TAG", "After subscribe");
输出看起来像这样(注意缺少RX_TAG_SUBSCRIBE
日志记录和最后一些元素):
RX_TAG: After subscribe
RX_TAG_LONG_LOAD: RxNewThreadScheduler-1
RX_TAG_FIRST: [1, Foo, lat1-1, long1-1]
RX_TAG_TWO: 1
RX_TAG_FIRST: [1, Foo, lat1-2, long1-2]
RX_TAG_FIRST: [2, Bar, lat2-1, long2-1]
RX_TAG_TWO: 2
RX_TAG_FIRST: [1, Foo, lat1-3, long1-3]
RX_TAG_FIRST: [1, Foo, lat1-4, long1-4]
RX_TAG_FIRST: [3, Ping, lat3-1, long3-1]
RX_TAG_TWO: 3
RX_TAG_FIRST: [2, Bar, lat2-2, long2-2]
RX_TAG_FIRST: [1, Foo, lat1-5, long1-5]
RX_TAG_FIRST: [2, Bar, lat2-3, long2-3]
RX_TAG_FIRST: [2, Bar, lat2-4, long2-4]
RX_TAG_FIRST: [1, Foo, lat1-6, long1-6]
RX_TAG_FIRST: [1, Foo, lat1-7, long1-7]
RX_TAG_FIRST: [3, Ping, lat3-2, long3-2]
RX_TAG_FIRST: [3, Ping, lat3-3, long3-3]
RX_TAG_FIRST: [2, Bar, lat2-5, long2-5]
RX_TAG_FIRST: [3, Ping, lat3-4, long3-4]
RX_TAG_FIRST: [2, Bar, lat2-6, long2-6]
RX_TAG_FIRST: [3, Ping, lat3-5, long3-5]
RX_TAG_FIRST: [2, Bar, lat2-7, long2-7]
RX_TAG_FIRST: [2, Bar, lat2-8, long2-8]
RX_TAG_FIRST: [3, Ping, lat3-6, long3-6]
RX_TAG_FIRST: [2, Bar, lat2-9, long2-9]
RX_TAG_FIRST: [3, Ping, lat3-7, long3-7]
RX_TAG_FIRST: [2, Bar, lat2-10, long2-10]
RX_TAG_FIRST: [2, Bar, lat2-11, long2-11]
RX_TAG_FIRST: [4, Dev, lat4-1, long4-1]
我看起来像某个操作符挂起并无限期地等待源序列完成。 如果我在源数据中注释掉第4组,它按预期工作,日志的最后部分如下所示:
RX_TAG_THREE: 1 (Foo) [ {lat1-1, long1-1} {lat1-2, long1-2} {lat1-3, long1-3} {lat1-4, long1-4} {lat1-5, long1-5} {lat1-6, long1-6} {lat1-7, long1-7} ]
RX_TAG_THREE: 2 (Bar) [ {lat2-1, long2-1} {lat2-2, long2-2} {lat2-3, long2-3} {lat2-4, long2-4} {lat2-5, long2-5} {lat2-6, long2-6} {lat2-7, long2-7} {lat2-8, long2-8} {lat2-9, long2-9} {lat2-10, long2-10} {lat2-11, long2-11} ]
RX_TAG_THREE: 3 (Ping) [ {lat3-1, long3-1} {lat3-2, long3-2} {lat3-3, long3-3} {lat3-4, long3-4} {lat3-5, long3-5} {lat3-6, long3-6} {lat3-7, long3-7} ]
RX_TAG_FOUR: RxNewThreadScheduler-1
RX_TAG_SUBSCRIBE: [1 (Foo) [ {lat1-1, long1-1} {lat1-2, long1-2} {lat1-3, long1-3} {lat1-4, long1-4} {lat1-5, long1-5} {lat1-6, long1-6} {lat1-7, long1-7} ], 2 (Bar) [ {lat2-1, long2-1} {lat2-2, long2-2} {lat2-3, long2-3} {lat2-4, long2-4} {lat2-5, long2-5} {lat2-6, long2-6} {lat2-7, long2-7} {lat2-8, long2-8} {lat2-9, long2-9} {lat2-10, long2-10} {lat2-11, long2-11} ], 3 (Ping) [ {lat3-1, long3-1} {lat3-2, long3-2} {lat3-3, long3-3} {lat3-4, long3-4} {lat3-5, long3-5} {lat3-6, long3-6} {lat3-7, long3-7} ]]
我做错了什么?