在Scala中组合zip和map操作

时间:2018-04-30 18:43:28

标签: scala scala-collections

我了解mapflatten操作可以合并到{1}},flatMapfilter合并到Scala中的map

我是否可以将collect / zipzipwithIndex操作合并?

2 个答案:

答案 0 :(得分:2)

据我所知,标准库中没有单个操作,但在各种元组上有一个扩展方法,称为zipped。此方法返回一个对象,该对象提供mapflatMap等方法,这些方法将使用映射执行压缩:

(xs, ys).zipped.map((x, y) => x * y)

此对象也可以隐式转换为Traversable,因此您可以调用更复杂的方法,例如mkStringfoldLeft

答案 1 :(得分:0)

如果由于某种原因,你真的想要一个组合版本,你可以自己写一个。

 db.collection("groups").document(id.get(i)).collection("members")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                id.add(document.getId());
                                Log.e(Tag, document.getId() + " => " + document.getData());

                                if (task.getResult().isEmpty()) {
                                    Log.d(Tag, "onSuccess: LIST EMPTY");
                                    return;
                                } else {
                                    // Convert the whole Query Snapshot to a list
                                    // of objects directly! No need to fetch each
                                    // document.
                                    Log.e(Tag, task.getResult() + "");
                                    typeAll = task.getResult().toObjects(GroupMembers.class);
                                }
                            }
                        } else {
                            Log.e(Tag, "Error getting documents: ", task.getException());
                        }

称之为:

implicit class SeqOps[A](s: Seq[A]) {
    def zipWithIndex2[A1 >: A, B >: Int, That](f: (A, Int) => (A1, B))(implicit bf: CanBuildFrom[Seq[A], (A1, B), That]): That = {
        val b = bf(s)
        var i = 0
        for (x <- s) {
            b += f(x, i)
            i += 1
        }
        b.result()
    }
}

我真的会考虑过这两次,而且很可能会采用任何其他方法。