1. 程式人生 > >Java 8常用的流操作

Java 8常用的流操作

ber sdi 新的 bak arr time fun java8 限定

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

assertEquals(Arrays.asList(1,2,3,,4,5),List);
上面 程序講述的是從Stream中生成一個列表。很多Stream操作都是惰性求值,因此調用Stream上一個系列的方法之後,還需要最後調用一個類似collect的及早求值方法。

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接口的一個實例。

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,使用它可以方便地實現一個比較器。

Java 8常用的流操作