?一、Java Stream API
????????Java Stream函數(shù)式編程接口最初在Java 8中引入,并且與 lambda 一起成為Java開(kāi)發(fā)里程碑式的功能特性,它極大的方便了開(kāi)放人員處理集合類(lèi)數(shù)據(jù)的效率。
????????Java Stream就是一個(gè)數(shù)據(jù)流經(jīng)的管道,并且在管道中對(duì)數(shù)據(jù)進(jìn)行操作,然后流入下一個(gè)管道。有學(xué)過(guò)linux 管道的同學(xué)應(yīng)該會(huì)很容易就理解。在沒(méi)有Java Stram之前,對(duì)于集合類(lèi)的操作,更多的是通過(guò)for循環(huán)。大家從后文中就能看出Java Stream相對(duì)于for 循環(huán)更加簡(jiǎn)潔、易用、快捷。
????????管道的功能包括:Filter(過(guò)濾)、Map(映射)、sort(排序)等,集合數(shù)據(jù)通過(guò)Java Stream管道處理之后,轉(zhuǎn)化為另一組集合或數(shù)據(jù)輸出。
二、Stream API代替for循環(huán)
先來(lái)看一個(gè)例子:
List<String> nameStrs = Arrays.asList("Monkey", "Lion", "Giraffe","Lemur");
List<String> list = nameStrs.stream()
.filter(s -> s.startsWith("L"))
.map(String::toUpperCase)
.sorted()
.collect(toList());
System.out.println(list);
- 首先,我們使用Stream()函數(shù),將一個(gè)List轉(zhuǎn)換為管道流。
- 調(diào)用filter函數(shù)過(guò)濾數(shù)組元素,過(guò)濾方法使用lambda表達(dá)式,以L開(kāi)頭的元素返回true被保留,其他的List元素被過(guò)濾掉。
- 然后調(diào)用Map函數(shù)對(duì)管道流中每個(gè)元素進(jìn)行處理,字母全部轉(zhuǎn)換為大寫(xiě)。
- 然后調(diào)用sort函數(shù),對(duì)管道流中數(shù)據(jù)進(jìn)行排序。默認(rèn)情況下,使用 sorted() 方法進(jìn)行排序時(shí),會(huì)按照自然順序進(jìn)行排序。對(duì)于字符串來(lái)說(shuō),自然順序即按照字母的升序進(jìn)行排序。sorted() 方法對(duì)轉(zhuǎn)換為大寫(xiě)形式后的字符串進(jìn)行排序。因?yàn)榇髮?xiě)字母的 Unicode 值小于相應(yīng)的小寫(xiě)字母,所以在排序時(shí)會(huì)先排列大寫(xiě)字母,然后是小寫(xiě)字母。
- 最后調(diào)用collect函數(shù)toList,將管道流轉(zhuǎn)換為L(zhǎng)ist返回。
???????最終的輸出結(jié)果是:[LEMUR, LION]。
? ? ? ? 當(dāng)然如果想要根據(jù)其他規(guī)則進(jìn)行排序,可以使用 sorted(Comparator)
方法,并提供一個(gè)自定義比較器來(lái)指定排序的規(guī)則。比如可以使用 sorted((str1, str2) -> str1.length() - str2.length())
來(lái)按字符串長(zhǎng)度進(jìn)行排序。
import java.util.Comparator;
public class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
return str1.length() - str2.length();
}
}
????????創(chuàng)建了一個(gè)名為 StringLengthComparator
的類(lèi),它實(shí)現(xiàn)了 Comparator<String>
接口。這個(gè)接口要求我們實(shí)現(xiàn) compare
方法來(lái)定義元素之間的排序規(guī)則。
????????在 compare
方法中,使用 str1.length() - str2.length()
來(lái)比較兩個(gè)字符串的長(zhǎng)度。如果 str1
的長(zhǎng)度小于 str2
的長(zhǎng)度,返回一個(gè)負(fù)值。如果 str1
的長(zhǎng)度大于 str2
的長(zhǎng)度,返回一個(gè)正值。如果 str1
和 str2
的長(zhǎng)度相等,返回 0。通過(guò)傳遞 new StringLengthComparator()
給 sorted()
方法,可以按照字符串長(zhǎng)度進(jìn)行排序。
List<String> sortedList = nameStrs.stream()
.filter(s -> s.startsWith("L"))
.map(String::toUpperCase)
.sorted(new StringLengthComparator())
.collect(Collectors.toList());
System.out.println(sortedList);
?????????當(dāng)然,使用Java 8之前的方法來(lái)實(shí)現(xiàn)對(duì)一個(gè)string列表進(jìn)行排序:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
????????使用 Lambda 表達(dá)式后的效果是:
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
// 只有一條邏輯語(yǔ)句,可以省略大括號(hào)
Collections.sort(names, (String a, String b) -> b.compareTo(a));
// 可以省略入?yún)㈩?lèi)型
Collections.sort(names, (a, b) -> b.compareTo(a));
三、將數(shù)組轉(zhuǎn)換為管道流
????????使用Stream.of()方法,將數(shù)組轉(zhuǎn)換為管道流。
String[] array = {"Monkey", "Lion", "Giraffe", "Lemur"};
Stream<String> nameStrs2 = Stream.of(array);
Stream<String> nameStrs3 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
四、將集合類(lèi)對(duì)象轉(zhuǎn)換為管道流
????????通過(guò)調(diào)用集合類(lèi)的stream()方法,將集合類(lèi)對(duì)象轉(zhuǎn)換為管道流。
List<String> list = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");
Stream<String> streamFromList = list.stream();
Set<String> set = new HashSet<>(list);
Stream<String> streamFromSet = set.stream();
五、將文本文件轉(zhuǎn)換為管道流
????????通過(guò)Files.lines方法將文本文件轉(zhuǎn)換為管道流,Paths.get()方法作用就是獲取文件,是Java NIO的API也就是說(shuō):我們可以很方便的使用Java Stream加載文本文件,然后逐行的對(duì)文件內(nèi)容進(jìn)行處理。
Stream<String> lines = Files.lines(Paths.get("file.txt"));
六、轉(zhuǎn)換成流后面的操作
????????一旦將數(shù)組或一組值轉(zhuǎn)換為流,你就可以使用流的各種操作方法對(duì)其進(jìn)行處理和操作。下面是一些示例操作:
①、遍歷流中的元素:
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
nameStrs2.forEach(System.out::println);
②、過(guò)濾流中的元素:
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
Stream<String> filteredStream = nameStrs2.filter(s -> s.startsWith("L"));
③、對(duì)流中的元素進(jìn)行轉(zhuǎn)換:
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
Stream<String> upperCaseStream = nameStrs2.map(String::toUpperCase);
?④、對(duì)流中的元素進(jìn)行排序:
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
Stream<String> sortedStream = nameStrs2.sorted();
⑤、對(duì)流中的元素進(jìn)行聚合操作:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-680851.html
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
Optional<String> longestString = nameStrs2.max(Comparator.comparingInt(String::length));
?⑥、收集流中的元素到集合中:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-680851.html
Stream<String> nameStrs2 = Stream.of("Monkey", "Lion", "Giraffe", "Lemur");
List<String> stringList = nameStrs2.collect(Collectors.toList());
到了這里,關(guān)于Java 8 新特性——Lambda 表達(dá)式(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!