如何使用 Stream API java 8 一起打印两个列表?
How to print two lists together using Stream API java 8?
我有两个列表如下
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);
最简单的方法是创建一个 IntStream
来生成索引,然后将每个索引映射到您要创建的 String
。
IntStream.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i)+":"+ages.get(i))
.forEach(System.out::println);
您可能也对这个 SO 问题感兴趣 Zipping streams using JDK8 with lambda (java.util.stream.Streams.zip),因为这是您要求的那种功能。
虽然 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));
});
我的 StreamEx 库对这种情况有一些语法糖:
StreamEx.zip(names, ages, (name, age) -> name+":"+age).forEach(System.out::println)
基本上里面与接受的答案相同。唯一的区别是如果列表大小不同,将抛出 IllegalArgumentException
。
我有两个列表如下
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);
最简单的方法是创建一个 IntStream
来生成索引,然后将每个索引映射到您要创建的 String
。
IntStream.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i)+":"+ages.get(i))
.forEach(System.out::println);
您可能也对这个 SO 问题感兴趣 Zipping streams using JDK8 with lambda (java.util.stream.Streams.zip),因为这是您要求的那种功能。
虽然 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));
});
我的 StreamEx 库对这种情况有一些语法糖:
StreamEx.zip(names, ages, (name, age) -> name+":"+age).forEach(System.out::println)
基本上里面与接受的答案相同。唯一的区别是如果列表大小不同,将抛出 IllegalArgumentException
。