如何使用Java Stream处理列表中的数据

时间:2018-03-19 20:07:36

标签: java java-8 java-stream

如何使用Java Stream迭代List中的2个循环。

public class ArrayStreams {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(2);

for (int i = 0; i < list.size(); i++) {
            for (int j = i + 1; j < list.size(); j++) {
                System.out.println("i :" + list.get(i) + "J :" + list.get(j));
            }
        }

    }
}

如何将此代码转换为Java Stream。请帮忙!

2 个答案:

答案 0 :(得分:5)

  

如何将此代码转换为Java Stream。

至少有两个原因不应该使用Streams:

  • 你没有迭代第二个循环中的所有元素,所以你应该跳过内循环中的第一个元素。
  • 首先您使用println(中列表的索引。流不是为维护流元素的索引而设计的。

答案 1 :(得分:1)

最简单的方法是循环的1:1转换

IntStream.range(0, list.size())
    .forEach(i -> IntStream.range(i+1, list.size())
        .forEach(j -> System.out.println("i :"+list.get(i)+"J :"+list.get(j))));

您也可以使用

IntStream.range(0, list.size())
    .forEach(i -> list.subList(i+1, list.size())
        .forEach(o -> System.out.println("i :"+list.get(i)+"J :"+o)));

相当于

for(int i = 0; i < list.size(); i++) {
    for(Integer o: list.subList(i + 1, list.size())) {
        System.out.println("i :" + list.get(i) + "J :" + o);
    }
}

尽管做得更好

for(int i = 0; i < list.size(); i++) {
    Integer o = list.get(i);
    String prefix = "i :" + o + "J :";
    for(Integer p: list.subList(i + 1, list.size())) {
        System.out.println(prefix + p);
    }
}

减少冗余工作。

更具说明性的方法是

IntStream.range(0, list.size()).boxed()
         .flatMap(i -> IntStream.range(i+1, list.size())
                                .mapToObj(j -> ("i :"+list.get(i)+"J :"+list.get(j))))
         .forEach(System.out::println);

不幸的是,由于缺乏简单易用的配对类型,减少冗余工作的替代方案不能轻易地表示为Stream操作。一种解决方案是:

IntStream.range(0, list.size())
         .mapToObj(i -> new Object(){ int index=i; String prefix="i :"+list.get(i)+"J :";})
         .flatMap( p -> list.subList(p.index+1, list.size()).stream().map(o -> p.prefix+o))
         .forEach(System.out::println);

显然,这不比嵌套的for循环更具可读性......