Stream是java8引入的一個重度使用lambda表達式的API。Stream使用一種類似用SQL語句從數據庫查詢數據的直觀方式來提供一種對Java集合運算和表達的高階抽象。直觀意味著開發者在寫代碼時只需關注他們想要的結果是什么而無需關注實現結果的具體方式。這一章節中,我們將介紹為什么我們需要一種新的數據處理API、Collection和Stream的不同之處以及如何將StreamAPI應用到我們的編碼中。
篩選重復的元素
Stream 接口支持 distinct 的方法, 它會返回一個元素(根據流所生成元素的 hashCode和equals方法實現)的流。
例如,以下代碼會篩選出列表中所有的偶數,并確保沒有 重復。
1
2
3
|
List<Dish> dishes = Dish.menu.stream() .filter(Dish::isVegetarian) .collect(Collectors.toList()); |
跳過指定數量的元素
Stream 支持 skip(n) 方法,返回一個扔掉了前n個元素的流。如果流中元素不足n個,則返回一 個空流。limit(n) 和 skip(n) 是互補的
1
2
3
|
List<Dish> dishSkip = Dish.menu.stream().filter(d -> d.getCalories() > 300 ).skip( 2 ) //去掉符合要求的集合中的前2個元素后返回 .collect(Collectors.toList()); dishSkip.forEach(System.out::println); |
map 操作
Stream 支持 map 方法,它會接受一個函數作為參數。這個函數會被應用到每個元素上,并將其映 射成一個新的元素
1
|
List<String> list = st.skip( 0 ).limit( 2 ).map(s->s.toUpperCase()).collect(Collectors.toList()); |
元素求和
1
2
3
4
5
|
List<Integer> numbers = Arrays.asList( 3 , 4 , 5 , 1 , 2 ); int sum1 = numbers.stream().reduce( 0 ,(a, b) -> a + b); System.out.println(sum1); int sum2 = numbers.stream().reduce( 0 ,Integer::sum); System.out.println(sum2); |
最大值
1
2
|
int max = numbers.stream().reduce( 0 ,Integer::max); System.out.println(max); |
最小值
1
2
3
|
//reduce不接受初始值,返回一個Optional對象(考慮流中沒有任何元素的情況) Optional<Integer> min = numbers.stream().reduce(Integer::min); min.ifPresent(System.out::println); |
總結
以上所述是小編給大家介紹的java8中的Stream數據流,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/clovejava/archive/2017/10/15/7674822.html