Java8 中常用的List Stream場景
Stream是Java 8添加的一個API,結(jié)合Lambda表達(dá)式,可以提高我們對對集合處理的編碼效率。在日常工作中,我們經(jīng)常會遇到List轉(zhuǎn)Map的情況,在Stream出來之前,我們一般都是遍歷放進(jìn)map中。
這里,我們假設(shè)有個User對象。
List轉(zhuǎn)Map
- Map中key和value都是User對象中的屬性值。
- Map<String, String> userMap = users.stream().collect(Collectors.toMap(User::getId, User::getName))。
- Map中key為User對象的屬性值,value為User對象。
- Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, User -> User))。
- 如果,我們的List中,key值重復(fù),則會出現(xiàn)Duplicate key異常,這時候,我們可以使用覆蓋的方式來避免這種異常。
- Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldVal, newVal) -> newVal))。
- Map中key為User對象的屬性值,value為UserList。
filter
- list stream過濾數(shù)據(jù)
- List<User> filterUsers=users.stream().filter(item -> item.getName().equals("xxx")).collect(Collectors.toList());
- 去重過濾
- List<String> ids=new ArrayList<>(); List<User> distinctUsers=users.stream().filter(item->{ if(!ids.contains(item.getId())){ ids.add(item.getId()); return true; }else{ return false; } }).collect(Collectors.toList());
- stream有提供distinct去重的函數(shù)。
sorted
1 .按年齡升序排。
2.按年齡降序排。
除了上面的一些函數(shù)外,還有功能強大的函數(shù),如:limit、max、reduce等。
Java Stream Debugger
在我們使用Stream之后,調(diào)試是一個問題。
在IDEA 2018后,會自帶Java Stream Debugger這個插件,有助于我們更直觀的了解Stream的執(zhí)行過程。插件有了,我們該如何使用呢?
- 在需要調(diào)試Stream的地方,打上斷點。
2.debug模式啟動后,在debug窗口中點擊Trace Current Stream Chain
我們可以點擊切換上面每一步的tab,查看其執(zhí)行的一個大致過程,我們也可以切換到Flat Mode模式
這里只是列舉了幾個常用的API,針對Stream的能力遠(yuǎn)比上面列舉幾個簡單的功能要強大。