【问题标题】:How to print two lists together using Stream API java 8?如何使用 Stream API java 8 一起打印两个列表?
【发布时间】:2015-05-10 15:41:32
【问题描述】:

我有两个列表如下

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

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    最简单的方法是创建一个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) 感兴趣,因为这是您所要求的功能。

    【讨论】:

      【解决方案2】:

      我的StreamEx 库为这种情况提供了一些语法糖:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我认为这只会打印ages 的第一个元素,因为您每次都会创建一个新的迭代器。
        • 第二个解决方案可能非常昂贵,因为列表副本和项目从一开始就被删除。
        • 两种解决方案都没有考虑到forEach忽略遇到顺序的事实
        猜你喜欢
        • 2014-06-15
        • 2023-03-18
        • 1970-01-01
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        相关资源
        最近更新 更多