如何使用流API java 8将两个列表一起打印?

如何使用流API java 8将两个列表一起打印?,java,java-8,java-stream,Java,Java 8,Java Stream,我有两个清单如下 List<String> names = Arrays.asList("James","John","Fred"); List<Integer> ages = Arrays.asList(25,35,15); 使用经典的方法很容易做到这一点 for(int i=0;i<names.size();i++){ System.out.println(names.get(i)+":"+ages.get(i)); } 最简单的方法是创建一个Int

我有两个清单如下

List<String> names = Arrays.asList("James","John","Fred");
List<Integer> ages = Arrays.asList(25,35,15);
使用经典的方法很容易做到这一点

for(int i=0;i<names.size();i++){
    System.out.println(names.get(i)+":"+ages.get(i));
}

最简单的方法是创建一个
IntStream
来生成索引,然后将每个索引映射到要创建的
字符串

IntStream.range(0, Math.min(names.size(), ages.size()))
         .mapToObj(i -> names.get(i)+":"+ages.get(i))
         .forEach(System.out::println);

另外,您可能会对这个SO问题感兴趣,因为这就是您所要求的功能。

虽然Alexis C.的答案是正确的,但有人会认为这是在Java 8中实现请求行为的最简单方法。我提议:

int[] i = {0};
names.forEach(name -> {
    System.out.println(name + ages.get(i[0]++));
});
甚至没有索引:

List<Integer> agesCopy = new ArrayList<Integer>(ages);
names.forEach(name -> {
    System.out.println(name + agesCopy.remove(0));
});
List agesCopy=新数组列表(ages);
name.forEach(名称->{
System.out.println(name+agesCopy.remove(0));
});
对于这种情况,我的库提供了一些语法支持:

StreamEx.zip(names, ages, (name, age) -> name+":"+age).forEach(System.out::println)

基本上,它的内部和公认的答案是一样的。唯一的区别是,如果列表的大小不同,将抛出
IllegalArgumentException

我认为这将只打印
ages
的第一个元素,因为您每次都要创建一个新的迭代器。第二个解决方案可能非常昂贵,因为列表副本和从一开始就删除项。这两个解决方案都不需要考虑到
forEach
忽略遭遇顺序这一事实
List<Integer> agesCopy = new ArrayList<Integer>(ages);
names.forEach(name -> {
    System.out.println(name + agesCopy.remove(0));
});
StreamEx.zip(names, ages, (name, age) -> name+":"+age).forEach(System.out::println)