java 8 Streams简介
文章目錄
- 創建Stream
- Streams多線程
- Stream的基本操作
- Matching
- Filtering
- Mapping
- FlatMap
- Reduction
- Collecting
- 總結
今天要講的Stream指的是java.util.stream包中的諸多類。Stream可以方便的將之前的結合類以轉換為Stream并以流式方式進行處理,大大的簡化了我們的編程,Stream包中,最核心的就是interface Stream
從上面的圖中我們可以看到Stream繼承自BaseStream。Stream中定義了很多非常實用的方法,比如filter,map,flatmap,forEach,reduce,collect等等。接下來我們將會逐一講解。
創建Stream
Stream的創建有很多方式,java引入Stream之后所有的集合類都添加了一個stream()方法,通過這個方法可以直接得到其對應的Stream。也可以通過Stream.of方法來創建:
//Stream CreationString[] arr = new String[]{"a", "b", "c"};Stream<String> stream = Arrays.stream(arr);stream = Stream.of("a", "b", "c");Streams多線程
如果我們想使用多線程來處理集合類的數據,Stream提供了非常方便的多線程方法parallelStream():
//Multi-threadingList<String> list =new ArrayList();list.add("aaa");list.add("bbb");list.add("abc");list.add("ccc");list.add("ddd");list.parallelStream().forEach(element -> doPrint(element));Stream的基本操作
Stream的操作可以分為兩類,一類是中間操作,中間操作返回Stream,因此可以級聯調用。 另一類是終止操作,這類操作會返回Stream定義的類型。
//Operationslong count = list.stream().distinct().count();上面的例子中,distinct()返回一個Stream,所以可以級聯操作,最后的count()是一個終止操作,返回最后的值。
Matching
Stream提供了anyMatch(), allMatch(), noneMatch()這三種match方式,我們看下怎么使用:
//Matchingboolean isValid = list.stream().anyMatch(element -> element.contains("h"));boolean isValidOne = list.stream().allMatch(element -> element.contains("h"));boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h"));Filtering
filter() 方法允許我們對Stream中的數據進行過濾,從而得到我們需要的:
Stream<String> filterStream = list.stream().filter(element -> element.contains("d"));上面的例子中我們從list中選出了包含“d”字母的String。
Mapping
map就是對Stream中的值進行再加工,然后將加工過后的值作為新的Stream返回。
//MappingStream<String> mappingStream = list.stream().map(element -> convertElement(element));private static String convertElement(String element) {return "element"+"abc";}上的例子中我們把list中的每個值都加上了“abc”然后返回一個新的Stream。
FlatMap
flatMap和Map很類似,但是他們兩個又有不同,看名字我們可以看到flatMap意思是打平之后再做Map。
怎么理解呢?
假如我們有一個CustBook類:
@Data public class CustBook {List<String> bookName; }CustBook定義了一個bookName字段。
先看一下Map返回的結果:
List<CustBook> users = new ArrayList<>();users.add(new CustBook()); Stream<Stream<String>> userStreamMap= users.stream().map(user -> user.getBookName().stream());在上面的代碼中,map將每一個user都轉換成了stream,所以最后的結果是返回Stream的Stream。
如果我們只想返回String,則可以使用FlatMap:
List<CustBook> users = new ArrayList<>();users.add(new CustBook());Stream<String> userStream= users.stream().map(user -> user.getBookName().stream());簡單點講FlatMap就是將層級關系鋪平重來。
Reduction
使用reduce() 方法可以方便的對集合的數據進行運算,reduce()接收兩個參數,第一個是開始值,后面是一個函數表示累計。
//ReductionList<Integer> integers = Arrays.asList(1, 1, 1);Integer reduced = integers.stream().reduce(100, (a, b) -> a + b);上面的例子我們定義了3個1的list,然后調用reduce(100, (a, b) -> a + b)方法,最后的結果是103.
Collecting
collect()方法可以方便的將Stream再次轉換為集合類,方便處理和展示:
List<String> resultList= list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());總結
Stream是java 8中的非常強大和實用的功能,大家一定要熟練掌握。
本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/java-8-streams-Introduction
更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
更多內容請訪問 http://www.flydean.com/java-8-streams-introduction/
總結
以上是生活随笔為你收集整理的java 8 Streams简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更加安全的密钥生成方法Diffie-He
- 下一篇: java中functional inte