[英]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.