【问题标题】:Predicate on ArraylistArraylist 上的谓词
【发布时间】:2016-11-07 03:26:32
【问题描述】:

我有两个数组列表,结构如下:

Arraylist A ::

{name : name1,
number : 1234
},
{name : name2,
number : 4567
},
{name : name3,
number : 6789
}

Arraylist B ::

{number : 1234,
userId : u1
},
{number : 4567
userId : u2
},
{number : 6789
userId : u3
}

现在我需要按以下方式合并两个数组:

Arraylist C ::

{name : name1,
number : 1234,
userId : u1
},
{name : name2,
number : 4567,
userId : u2
},
{name : name3,
number : 6789,
userId : u3
}

如何使用谓词来实现这一点?有人可以帮忙吗?

实际情况就像我有一个 来自设备联系人 的联系人的数组列表,其中包含 姓名、号码、emailId,当我将这些联系人与我的 同步时app serveri 得到 number、userId 和 Image Url 作为回报。现在我需要用这两个数组映射数字,并需要生成 common 数组,其中包含所有详细信息,如 number、name、emailId、userId、Image Url

提前致谢。

【问题讨论】:

  • 我认为在这种情况下使用字典是更好的方法。
  • 元素有哪些类型?他们只是Map的吗?
  • @JornVernee - 它们属于实体(模型)类型。这里只是一个简短的结构演示,因为我不能在这里打印实体类

标签: java android arraylist predicate


【解决方案1】:

我昨天做了这个实用函数来压缩两个列表。

您传入两个列表和一个BiFunction,它使用每个列表中的一个元素并创建一个新元素以添加到结果列表中:

public static <T, S, R> List<R> zip(List<? extends T> l1, List<? extends S> l2,
    BiFunction<? super T, ? super S, R> zipper) {

    int size = Math.min(l1.size(), l2.size());
    List<R> result = new ArrayList<>();

    for(int i = 0; i < size; i++)
        result.add(zipper.apply(l1.get(i), l2.get(i)));

    return result;
}

这样使用:

class A {...}
class B {...}

class C { // Combination of A and B
    ...
    public C(name, number, emailId, userId, imageUrl) {...} // Types ommitted

    // public C(A a, B b) {...} // <-- optionally this, you could just pass C::new
    ...
}
List<A> list1 = ...;
List<B> list2 = ...;

List<C> list3 = zip(list1, list2, 
    (a, b) -> new C(a.getName(), a.getNumber(), a.getEmailID(),
        b.getUserId(), b.getImageUrl())); // Use appropriate getters.

我在 Java API 中找不到类似的东西。

【讨论】:

  • BiFunction 类需要 API 级别 24 或更高。所以不能用。这是相同的参考developer.android.com/reference/java/util/function/…
  • @Jigar 您可以自己轻松实现:interface BiFunction&lt;T, S, R&gt; { R apply(T, S); }(仍然缺少andThen,但这里不需要)
  • 好的,我试试这个方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多