lambda也叫函式式程式設計 包括此方法都是(function super r, ? extends v> after)
1首生 lambd表示式簡化了方法的定義,匿名的方法直接實現邏輯 使用方式 (x, y) -> x + y; 返回x+y之和,有引數的匿名 ,無參方法, () -> ,不需要寫方法單獨去實現。
表示式賦值的話,必須是final 型別的陣列
//中國的ip,記錄下來,跳過此ip去分配內網ip
final string cn_ip_str = ;
list_ip.stream().foreach(nodeip ->
system.out.println(model.getname() + ", en: " + model.getisocode() + " ip: " + model.getcountryip());
} catch (ioexception e) catch (geoip2exception e)
});
ps類名.方法名 = :: , arraylist::new , classname:getname例1 list.foreach(o -> ); //foreach函式實現內部迭代 system.out::println 效果一樣
集合類(包括list)現在都有乙個foreach方法,對元素進行迭代(遍歷),所以我們不需要再寫for迴圈了。foreach方法接受乙個函式介面consumer做引數
list.stream().filter(smap -> null != smap.get("ip") && !"".equals(smap.get("ip"))).foreach(imp -> );
2結全stream 的流式處理,對於list的遍歷更加節省**量,簡潔高效
listshapes = ...
shapes.stream()
.filter(s -> s.getcolor() == blue)
.foreach(s -> s.setcolor(red));
首先呼叫stream方法,以集合類物件shapes裡面的元素為資料來源,生成乙個流。然後在這個流上呼叫filter方法,挑出藍色的,返回另乙個流。最後呼叫foreach方法將這些藍色的物體噴成紅色。
還有乙個方法叫parallelstream(),顧名思義它和stream()一樣,只不過指明要並行處理,以期充分利用現代cpu的多核特性。
shapes.parallelstream(); // 或shapes.stream().parallel()
ps下面是典型的大資料處理方法,filter-map-reduce:
//給出乙個string型別的陣列,找出其中所有不重複的素數
public void distinctprimary(string... numbers)
第一步:傳入一系列string(假設都是合法的數字),轉成乙個list,然後呼叫stream()方法生成流。
第二步:呼叫流的map方法把每個元素由string轉成integer,得到乙個新的流。map方法接受乙個function型別的引數,上面介紹了,function是個函式介面,所以這裡用λ表示式。
第三步:呼叫流的filter方法,過濾那些不是素數的數字,並得到乙個新流。filter方法接受乙個predicate型別的引數,上面介紹了,predicate是個函式介面,所以這裡用λ表示式。
第四步:呼叫流的distinct方法,去掉重複,並得到乙個新流。這本質上是另乙個filter操作。
第五步:用collect方法將最終結果收集到乙個list裡面去。collect方法接受乙個collector型別的引數,這個引數指明如何收集最終結果。在這個例子中,結果簡單地收集到乙個list中。我們也可以用collectors.tomap(e->e, e->e)把結果收集到乙個map中,它的意思是:把結果收到乙個map,用這些素數自身既作為鍵又作為值。tomap方法接受兩個function型別的引數,分別用以生成鍵和值,function是個函式介面,所以這裡都用λ表示式。
你可能會覺得在這個例子裡,list l被迭代了好多次,map,filter,distinct都分別是一次迴圈,效率會不好。實際並非如此。這些返回另乙個stream的方法都是「懶(lazy)」的,而最後返回最終結果的collect方法則是「急(eager)」的。在遇到eager方法之前,lazy的方法不會執行。
當遇到eager方法時,前面的lazy方法才會被依次執行。而且是管道貫通式執行。這意味著每乙個元素依次通過這些管道。例如有個元素「3」,首先它被map成整數型3;然後通過filter,發現是素數,被保留下來;又通過distinct,如果已經有乙個3了,那麼就直接丟棄,如果還沒有則保留。這樣,3個操作其實只經過了一次迴圈。
reduce方法用來產生單一的乙個最終結果 .distinct().reduce(0, (x,y) -> x+y); // equivalent to .sum()。
流有很多預定義的reduce操作,如sum(),max(),min()等。
int sum = l.stream()
.map(e -> new integer(e))
.filter(e -> primes.isprime(e))
.distinct()
.reduce(0, (x,y) -> x+y); // equivalent to .sum()
方法引用(method reference)
integer::parseint //靜態方法引用
system.out::print //例項方法引用
person::new //構造器引用
ps 下面求和的簡潔方法,聚合函式都可以實現
public void distinctprimarysum(string... numbers)
生成器函式
列印5個隨機數:
stream.generate(math::random).limit(5).foreach(system.out::println);
注意這個limit(5),如果沒有這個呼叫,那麼這條語句會永遠地執行下去。也就是說這個生成器是無窮的。這種呼叫叫做終結操作,或者短路(short-circuiting)操作。
jdk1.8, rt.jar包下面的函式式程式設計和流式處理包 流式處理是用的管道
Java8 Stream經典示例
示例一 class user public int getid public string tostring 現在有乙個list的集合,如何把這個list轉換成map其中,key是user id,value是user物件 如下 listusers arrays.aslist new user 1,t...
Java8 Stream 中間操作
1 filter 過濾,接收lambda,從流中排除某些元素 內部迭代 迭代操作有stream api完成 test public void test1 終止操作 一次性執行全部內容 stream.foreach system.out println 外部迭代 test public void te...
JAVA8 stream 流相關操作
1.查詢流中滿足條件的第乙個元素 集合 stream filter item 條件 findany get 集合 stream filter item 條件 findfirst get 2.內迴圈 集合 stream foreach item 3.將集合轉換為map function.identit...