Google Guava"zip"两个列表

Ste*_*Kuo 18 java guava

使用Google Guava(Google Commons),有没有办法将两个大小相同的列表合并到一个列表中,新列表包含两个输入列表的复合对象?

例:

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 + ")";
    }
}
Run Code Online (Sandbox Code Playgroud)

List<String> names = Lists.newArrayList("Alice", "Bob", "Charles");
List<Integer> ages = Lists.newArrayList(42, 27, 31);

List<Person> persons =
    transform with a function that converts (String, Integer) to Person
System.out.println(persons);
Run Code Online (Sandbox Code Playgroud)

输出:

[(Alice, 42), (Bob, 27), (Charles, 31)]
Run Code Online (Sandbox Code Playgroud)

shm*_*sel 25

从番石榴21开始,这可以通过以下方式实现Streams.zip():

List<Person> persons = Streams.zip(names.stream(), ages.stream(), Person::new)
                              .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Ste*_*Kuo 16

看起来这个目前还没有Guava,但是它是一个理想的功能.特别是看到这个github问题Iterators.zip().


ste*_*ian 10

假装这是一种番石榴方法:

for (int i = 0; i < names.size(); i++) {
    persons.add(new Person(names.get(i), ages.get(i)));
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案忽略了这一点.当然我可以写一个for循环.我正在寻找将"zip"模式应用于两个集合的通用方法.如果明天我需要将`X`s和`Y`s合并到```列表中,我必须复制上面的代码并修改它. (17认同)
  • @SteveKuo:番石榴可能提供哪些API会导致比这更短的解决方案?即使Guava添加了一个`BiFunction`接口或者某个东西,以及一个`zipWith`方法,所产生的匿名类也会比这个简单的`for`循环更长. (7认同)
  • @SteveKuo如果集合中的元素没有索引,该怎么办?集合浮现在脑海中. (3认同)
  • @Max或`Iterable`s.(你通常不想拉链,因为他们没有订单.虽然交叉产品会很有用) (3认同)
  • 有关使用转换的概念,请参阅"Guava中的功能习语,解释"https://code.google.com/p/guava-libraries/wiki/FunctionalExplained (2认同)