Observable.groupBy()限制输入数据的数量?

时间:2017-07-26 10:58:31

标签: android rx-java rx-android

我有以下两个类和功能:

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} ]]

我做错了什么?

0 个答案:

没有答案