Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 谷歌番石榴“;zip";两张名单_Java_Guava - Fatal编程技术网

Java 谷歌番石榴“;zip";两张名单

Java 谷歌番石榴“;zip";两张名单,java,guava,Java,Guava,使用GoogleGuava(GoogleCommons),有没有办法将两个大小相等的列表合并为一个列表,新列表包含两个输入列表的复合对象 例如: public class Person { public final String name; public final int age; public Person(String name, int age) { this.name = name; this.age = age; }

使用GoogleGuava(GoogleCommons),有没有办法将两个大小相等的列表合并为一个列表,新列表包含两个输入列表的复合对象

例如:

public class Person {
    public final String name;
    public final int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "(" + name + ", " + age + ")";
    }
}


假设这是一种番石榴法:

for (int i = 0; i < names.size(); i++) {
    persons.add(new Person(names.get(i), ages.get(i)));
}
for(int i=0;i
看起来这是目前番石榴中没有的功能,但它是一种理想的功能。请看,尤其是
Iterators.zip()
这里有一个没有显式迭代的版本,但是它变得非常丑陋

List<Person> persons = ImmutableList.copyOf(Iterables.transform(
    ContiguousSet.create(Range.closedOpen(0, names.size()),
        DiscreteDomain.integers()),
    new Function<Integer, Person>() {
      @Override
      public Person(Integer index) {
        return new Person(names.get(index), ages.get(index));
      }
    }));
List persons=ImmutableList.copyOf(Iterables.transform)(
create(Range.closedOpen(0,names.size()),
离散域整数()),
新函数(){
@凌驾
公众人士(整数指数){
返回新的人员(name.get(索引)、age.get(索引));
}
}));
它实际上并不比显式迭代好多少,您可能需要某种程度的边界检查,以确保两个输入的大小确实相同。

您可以参考

underline java
是java的
underline.js
端口,
zip
方法可以实现这一目标

以下是示例代码和输出:

$.zip(Arrays.asList("moe", "larry", "curly"), Arrays.asList("30", "40", "50"));
=>[[moe,30],[larry,40],[curly,50]]


从Guava 21开始,这可以通过以下方式实现:

List persons=Streams.zip(names.stream()、ages.stream()、Person::new)
.collect(Collectors.toList());

这里有一种使用vanilla Java压缩列表的通用方法。由于缺少元组,我选择使用映射条目列表(如果您不喜欢使用映射条目,请引入一个额外的类
ZipEntry
或类似的东西)

publicstaticlist-zip(List-zipLeft,List-zipRight){
List zipped=new ArrayList();
对于(int i=0;i
要同时支持阵列,请执行以下操作:

@SuppressWarnings("unchecked")
public static <T1,T2> Map.Entry<T1,T2>[] zip(T1[] zipLeft, T2[] zipRight) {
    return zip(asList(zipLeft), asList(zipRight)).toArray(new Map.Entry[] {});
}
@SuppressWarnings(“未选中”)
公共静态映射。条目[]zip(T1[]zipLeft,T2[]zipRight){
返回zip(asList(zipLeft),asList(zipRight)).toArray(newmap.Entry[]{});
}

为了使它更加健壮,可以在列表大小等方面添加前置条件检查,或者引入类似于SQL查询的左连接/右连接语义。

为什么您需要一个专门的函数来实现这一点,为什么不自己编写一个简单的函数呢?Guava提供的任何东西都比直接的
for
循环更复杂,这很简单,你有什么没告诉我们的吗?您所引用的示例是,期望外部库了解您的
人员
类,这有点荒谬。。。做你想做的事情所需要的反射量会比下面给出的相当明显的答案慢得多。@dcsohl看看这是怎么回事useful@arshajii因为这是一个标准的功能性的东西,番石榴支持一些功能性的构造。这个答案没有抓住要点。当然我可以写一个for循环。我正在寻找将“zip”模式应用于两个集合的通用方法。如果明天我需要将
X
s和
Y
s合并到
Z
s列表中,我必须复制上面的代码并对其进行修改。@SteveKuo:Guava可能提供什么API来缩短解决方案?即使Guava添加了一个
BiFunction
接口或其他东西,以及一个
zipWith
方法,生成的匿名类也会比这个简单的
for
循环长。有关使用transform@SteveKuo的概念,请参阅“Guava中的函数习惯用法,解释”。如果集合中的元素没有索引怎么办?我想到了集合。@Max或
Iterable
s。(您通常不想压缩集合,因为它们没有顺序。交叉乘积会很有用)这是javascript而不是java。>下划线java是下划线.js for java的一个端口
$.zip(Arrays.asList("moe", "larry", "curly"), Arrays.asList("30", "40", "50"));
List<Person> persons = Streams.zip(names.stream(), ages.stream(), Person::new)
                              .collect(Collectors.toList());
public static <T1,T2> List<Map.Entry<T1,T2>> zip(List<T1> zipLeft, List<T2> zipRight) {
    List<Map.Entry<T1,T2>> zipped = new ArrayList<>();
    for (int i = 0; i < zipLeft.size(); i++) {
        zipped.add(new AbstractMap.SimpleEntry<>(zipLeft.get(i), zipRight.get(i)));
    }
    return zipped;
}
@SuppressWarnings("unchecked")
public static <T1,T2> Map.Entry<T1,T2>[] zip(T1[] zipLeft, T2[] zipRight) {
    return zip(asList(zipLeft), asList(zipRight)).toArray(new Map.Entry[] {});
}