91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java8中流處理的示例分析

發布時間:2021-09-14 09:11:07 來源:億速云 閱讀:119 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“java8中流處理的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java8中流處理的示例分析”這篇文章吧。

我就隨便舉個例子,看看Stream有多優雅。

// 對蘋果按顏色匯總并績數量
Map<String, Long> appleCount = apples.stream()
 .collect(groupingBy(Apple::getColor, counting()));
// 過濾掉顏色為黑色的蘋果,并匯總好蘋果的總金額
Double sum = apples.stream()
 .filter(i->"black".equals(i.getColor()))
 .collect(toList);

一、lambda表達式

雖然本文重點是stream,但是stream中需要傳遞lambda表達式,所以簡單介紹一下lambda表達式。lambda表達式其實就是匿名函數(anonymous function),是指一類無需定義標識符的函數或子程序。

java中匿名函數的表現形式,只留下入參和方法體中的內容

// 普通函數
public void run(String s){
 System.out.print(s+"哈哈");
}
// 我不要名字啦!!!
(s)->System.out.print(s+"哈哈")

誒,過去我們都用對象調方法的,你弄這個沒名的東西啥時候用啊?

java中我們通過函數式接口來使用這種匿名函數。

函數式接口

1.java中只包含一個未實現方法的接口。其中可以有與Object中同名的方法和默認方法(java8中接口方法可以有默認實現)。

2.java中函數式接口使用@FunctionalInterface進行注解。Runnable、Comparator都是函數式接口。

3.java.util.function包下為我們提供很多常用的函數式接口,例如Function等。

用法舉例:

// 實現Runnable中的run方法,替代匿名內部類。
Runnable r = ()->System.out.print("哈哈");
// 作為參數傳遞。
new Thread(()-> System.out.println("haha")).start();

ArrayList<Apple> list = new ArrayList<>();
list.forEach(i-> System.out.println(i.getWeight()));


// 簡化策略模式
public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){
 List<Apple> apples = new ArrayList<>();
 for(Apple apple : inventory){
 if(p.test(apple)){
 apples.add(apple);
 }
 }
 return apples;
}
public class BigApple implement ApplePredicate{
 @Override
 public boolean test(Apple a){
 if(a.getWeight>10){
 return a
 }
 }
}
// 這是個簡單的策略模式,根據用戶的需要,創建不同的接口ApplePredicate實現類,調用時傳入不同的實現類就可以,但問題是如果需求過多,創建的實現類也會很多,過于臃腫不方便管理。
xx.filterApple(inventory,new BigApple);
// 使用lambda表達式,不在需要創建BigApple類
xx.filterApple(inventory,i->(i.getWeight>10));

使用lambda表達式可以簡化大量的模板代碼,并且可以向方法直接傳遞代碼。

總之

方法出參入參來自函數式接口

//入參s,返回void
(s)->System.out.println(s);
//入參空,返回void
()->System.out.print("haha");
//入參i,返回i+1
i->i+1
//后面寫代碼塊
apple->{if(apple.getWeiht>5) return "BIG";
 else return "small";
 }

好了,不多啰嗦了,如果感興趣推薦下面的文章或《Java8實戰》的前三章。

1.Lambda表達式有何用處?如何使用?

2.java8實戰

二、Stream

流是什么?

Java API的新成員,它允許你使用聲明式方式處理數據集合(類似sql,通過查詢語句表達,而不是臨時編寫一個實現)。

如果有人說lambda表達式不易于理解,那還勉強可以接受(其實過于復雜的lambda缺失不好閱讀,但通常lambda不會做太復雜的實現),但流真的非常的易懂易用。這個語法糖真的是甜死了。

注意事項:

1.流只能使用一次,遍歷結束就代表這個流被消耗掉了

2.流對集合的操作屬于內部迭代,是流幫助我們操作,而不是外部迭代

3.流操作包含:數據源,中間操作鏈,終端操作三個部分。

基礎流操作

List<Double> collect = list.stream()
 // 過濾掉黑色的蘋果
 .filter(i -> "black".equals(i.getColor()))
 // 讓蘋果按照重量個價格排序
 .sorted(Comparator.comparing(Apple::getWeight)
 .thenComparing(i->i.getPrice()))
 // 篩選掉重復的數據
 .distinct()
 // 只要蘋果的價格
 .map(Apple::getPrice)
 // 只留下前兩條數據
 .limit(2)
 // 以集合的形式返回
 .collect(toList());
// 循環打印列表中元素
list.forEach(i->System.out.print(i));

Apple::getPrince<=>i -> i.getPrince()可以看做是僅涉及單一方法的語法糖,效果與lambda表達式相同,但可讀性更好。

同理

下面列表為常見操作

中間

操作類型作用函數描述函數
filter中間過濾T -> booleanPredicate
sorted中間排序(T,T)->intComparator
map中間映射T->RFunction<T,R>
limit中間截斷

distinct中間去重,根據equals方法

skip中間跳過前n個元素

終端

操作類型作用
forEach終端消費流中的每個元素,使用lambda進行操作
count終端返回元素個數,long
collect終端將流歸約成一個集合,如List,Map甚至是Integer

篩選與切片

List<String> strings = Arrays.asList("Hello", "World");
List<String> collect1 = strings.stream()
 // String映射成String[]
 .map(i -> i.split(""))
 // Arrays::Stream 數據數組,返回一個流String[]->Stream<String>
 // flatMap各數組并不分別映射成一個流,而是映射成流的內容 Stream<String>->Stream
 .flatMap(Arrays::stream)
 .collect(toList());
System.out.println(collect);
----->輸出 [H, e, l, l, o, W, o, r, l, d]

歸約操作reduce

List<Integer> integers = Arrays.asList(12, 3, 45, 3, 2,-1);
// 有初始值的疊加操作
Integer reduce = integers.stream().reduce(3, (i, j) -> i + j);
Integer reduce2 = integers.stream().reduce(5, (x, y) -> x < y ? x : y);
// 無初始值的疊加操作
Optional<Integer> reduce1 = integers.stream().reduce((i, j) -> i + j);
// 無初始值的最大值
Optional<Integer> reduce4 = integers.stream().reduce(Integer::min);
// 無初始值的最大值
Optional<Integer> reduce5 = integers.stream().reduce(Integer::max);
// 求和
Optional<Integer> reduce6 = integers.stream().reduce(Integer::sum);

reduce做的事情是取兩個數進行操作,結果返回取下一個數操作,以次類推。

Optional是java8引入的新類,避免造成空指針異常,在集合為空時,結果會包在Optional中,可以用isPresent()方法來判斷是否為空值。

無初始值的情況下可能為空,故返回Optional

中間

操作類型作用函數描述函數
flatmap中間使通過的流返回內容T -> booleanPredicate

終端

操作類型作用
anyMatch終端返回boolean,判斷是否有符合條件內容
noneMatch終端返回boolean,判斷是否無符合條件內容
allMatch終端返回boolean,判斷是全為符合條件內容
findAny終端Optional,隨機找一個元素返回
findFirst終端Optional,返回第一個元素
reduce終端Optional (T,T)->T 歸約操作

數值流

包裝類型的各種操作都會有拆箱操作和裝箱操作,嚴重影響性能。所以Java8為我們提供了原始數值流。

// 數值流求平均值
OptionalDouble average = apples.stream()
 .mapToDouble(Apple::getPrice)
 .average();
// 數值流求和
OptionalDouble average = apples.stream()
 .mapToDouble(Apple::getPrice)
 .sum();
// 數值流求最大值,沒有則返回2
double v = apples.stream()
 .mapToDouble(Apple::getPrice)
 .max().orElse(2);
// 生成隨機數
IntStream s = IntStream.rangeClosed(1,100);

下面列表為常見數值流操作操作

中間

操作類型作用
rangeClosed(1,100)中間生成隨機數(1,100]
range(1,100)中間生成隨機數(1,100)
boxed()中間包裝成一般流
mapToObj中間返回為對象流
mapToInt中間映射為數值流

終端,終端操作與List一般流類似

構建流

值創建

Stream<String> s = Stream.of("java","python");

數組創建

int[] i = {2,3,4,5};
Stream<int> = Arrays.stream(i);

由文件生成,NIO API已經更新,以便利用Stream API

Stream<String> s = Files.lines(Paths.get("data.txt"),Charset.defaultCharset());

由函數創建流:無限流

// 迭代
Stream.iterate(0,n->n+2)
 .limit(10)
 .forEach(System.out::println);
// 生成,需要傳遞實現Supplier<T>類型的Lambda提供的新值
Stream.generate(Math.random)
 .limit(5)
 .forEach(System.out::println);

以上是“java8中流處理的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南雄市| 东乡族自治县| 承德县| 济源市| 正镶白旗| 洞头县| 临西县| 且末县| 永清县| 宽城| 佛学| 黑水县| 虞城县| 博湖县| 华安县| 太原市| 安陆市| 乐东| 正蓝旗| 蒲城县| 涞源县| 同江市| 新兴县| 石门县| 康马县| 巴塘县| 腾冲县| 盈江县| 潜江市| 阳春市| 治县。| 连云港市| 宿迁市| 邯郸市| 斗六市| 疏附县| 什邡市| 夏津县| 罗城| 汕尾市| 三都|