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

时间:2015-05-09 20:25:53

标签: java java-8 java-stream

我有两个列表如下

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

有没有办法使用Stream API java 8?

我能做的只是打印一个单一列表

names.stream().forEach(System.out::println);

3 个答案:

答案 0 :(得分:14)

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

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

此外,您可能对此问题Zipping streams using JDK8 with lambda (java.util.stream.Streams.zip)感兴趣,因为这是您要求的功能。

答案 1 :(得分:7)

我的StreamEx库对于这种情况有一些语法糖:

/opt/myproject/flask

基本上里面的内容与接受的答案相同。唯一的区别是,如果列表大小不同,将会抛出StreamEx.zip(names, ages, (name, age) -> name+":"+age).forEach(System.out::println)

答案 2 :(得分: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));
});