从番石榴21开始,这是可能的 Streams.zip() :
Streams.zip()
List<Person> persons = Streams.zip(names.stream(), ages.stream(), Person::new) .collect(Collectors.toList());
这是一个没有明确迭代的版本,但它变得非常难看。
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)); } }));
它实际上没有比显式迭代好多少,并且您可能需要某种程度的边界检查以确保两个输入确实具有相同的大小。
假装这是一种番石榴方法:
for (int i = 0; i < names.size(); i++) { persons.add(new Person(names.get(i), ages.get(i))); }
看起来这个目前还没有Guava,但是它是一个理想的功能。看到 这个github问题 , 特别是 Iterators.zip() 。
Iterators.zip()
你可以参考 下划线-java库 。
Underscore-java 是一个港口 Underscore.js 对于Java,和 zip 方法可以达到目的。
Underscore-java
Underscore.js
zip
以下是示例代码&amp;输出:
$.zip(Arrays.asList("moe", "larry", "curly"), Arrays.asList("30", "40", "50"));
=&GT; [[moe,30],[larry,40],[卷曲,50]]
这是使用vanilla Java压缩列表的通用方法。缺少元组,我选择使用地图条目列表(如果你不喜欢使用地图条目,引入一个额外的类 ZipEntry 或者其他的东西)。
ZipEntry
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[] {}); }
为了使其更健壮,在列表大小等上添加前置条件检查,或者引入 离开加入 / 正确加入 语义类似于SQL查询。