簡體   English   中英

如何使用Java Stream處理列表中的數據

[英]How to process data in a list using 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。 請幫忙!

我如何將此代碼轉換為Java Stream。

您不應出於至少兩個原因使用Streams:

  • 您不會在第二個循環中迭代所有元素,因此您應該跳過內部循環中的第一個元素。
  • 最重要的是,您可以在println( )中使用列表的索引。 流並非旨在維護流元素的索引

最簡單的方法是循環的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循環更易讀...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM