Java 8經常使用的流操做

如下都是我從《java 8函數式編程》看到的,
collect(toList())
collect(toList())方法是由stream裏面的值生成的一個列表,是一個及早求值的操做。
List<Integer> list = Stream.of(1,2,3,4,5,).collect(Collectors.toList());java

assertEquals(Arrays.asList(1,2,3,,4,5),List);
上面 程序講述的是從Stream中生成一個列表。不少Stream操做都是惰性求值,所以調用Stream上一個系列的方法以後,還須要最後調用一個相似collect的及早求值方法。git

map
假設函數能夠將一種類型的值轉換成另一種類型,map操做就可使用該函數,將流中的值轉換成一個新的流,如map將字符串轉換爲大寫形式
List<String> collect = Stream.of("a","b","hello").map(String->string.toUpperCase()).collect(toList());編程

assertEqual(asList("A","B","HELLO"),collect);
傳給map的Lambda表達式只接受一個String類型的參數,返回一個新的string。參數和返回值沒必要屬於同一種類型,可是lambda表達式必須是Function接口的一個實例。ide

filter
遍歷數據並檢查其中的元素時,可嘗試使用stream提供新的方法
以往咱們都是循環遍歷列表,使用條件語句作判斷。這能夠被稱爲filter模式。
List<String> beginningWithNumbers = Stream.of("a","1abc","abc1").filter(value->isDigit(value.charAt(0)))
.collect(toList());
filter也是接受一個函數做爲參數,該函數用Lambda表達式表示。函數式編程

flatMap
flatMap方法能夠用Stream替換值,而後將多個Stream鏈接成一個Stream。Map操做是用一個新的值代替Stream中的值。可是,用戶但願讓map操做有點不同,生成一個新的Stream對象來替換。用戶不但願結果是一連串的流,此時flatMap最能派上用場。
List<Integer> together = Stream.of(asList(1,2),asList(3,4)).flatMap(number ->numbers.stream()).collect(toList());
assertEquals(asList(1,2,3,4),together);
調用stream方法,將每一個列表轉換成stream對象,其他部分由flatMap方法處理。flatMap方法的相關函數接口和map的方法同樣,都是Functio接口,只是方法的返回值限定爲Stream類型。函數

max和min
Stream上經常使用的操做之一就是求最大值和最小值。Stream API中的max和min操做足以解決這一問題。
Stream查找最短曲目
List<Track> tracks = asList(new Track("Bakai",524),
new Track("Violets for Your Furs",378),
new Track("Time Was",451));對象

Track shortestTrack = track.stream().min((Comparator.comparing(track ->track.getLength())).get();排序

assertEquals(tracks.get(1),shortestTrack);
查找Stream中的最大或最小元素,首先考慮排序的指標。爲了讓Stream對象按照曲目長度進行排序,須要傳給他一個comparator對象。java8 提供一個新的靜態方法compaing,使用它能夠方便地實現一個比較器。接口

相關文章
相關標籤/搜索