如何使用Stream API Java 8一起打印两个列表?

13

我有两个列表,如下所示

List<String> names = Arrays.asList("James","John","Fred");
List<Integer> ages = Arrays.asList(25,35,15);
我想做的是将这两个列表打印出来,格式如下。
James:25
John:35
Fred:15

使用经典方法做这件事很容易

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

有没有一种方法可以使用Java 8的Stream API来完成它?

我所能做的就是仅打印单个列表。

names.stream().forEach(System.out::println);
3个回答

15

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

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

你可能对这个SO问题感兴趣: 使用JDK8和Lambda (java.util.stream.Streams.zip)压缩流,因为这是你所寻求的功能。


7

我的StreamEx库为此情况提供了一些简化代码的语法糖:

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

基本上,在内部,它与接受的答案相同。唯一的区别是,如果列表的大小不同,将抛出IllegalArgumentException异常。


1

虽然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));
});

3
我认为这会仅打印出ages的第一个元素,因为你每次都创建了一个新的迭代器。 - Jeffrey Bosboom
第二种解决方案可能非常昂贵,因为需要复制列表并从开头删除项目。 - jsosnowski
两种解决方案都没有考虑到 forEach 忽略遍历顺序这一事实。 - Elad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接