国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

一文吃透 JAVA Stream 流操作!

共 16594字,需瀏覽 34分鐘

 ·

2022-09-17 20:25

大家好,我是魚皮。在JAVA中,涉及到對(duì)數(shù)組、Collection等集合類中的元素進(jìn)行操作的時(shí)候,通常會(huì)通過(guò)循環(huán)的方式進(jìn)行逐個(gè)處理,或者使用Stream的方式進(jìn)行處理。

例如,現(xiàn)在有這么一個(gè)需求:

從給定句子中返回單詞長(zhǎng)度大于5的單詞列表,按長(zhǎng)度倒序輸出,最多返回3個(gè)

JAVA7及之前的代碼中,我們會(huì)可以照如下的方式進(jìn)行實(shí)現(xiàn):

/**
 * 【常規(guī)方式】
 * 從給定句子中返回單詞長(zhǎng)度大于5的單詞列表,按長(zhǎng)度倒序輸出,最多返回3個(gè)
 *
 * @param sentence 給定的句子,約定非空,且單詞之間僅由一個(gè)空格分隔
 * @return 倒序輸出符合條件的單詞列表
 */

public List<String> sortGetTop3LongWords(@NotNull String sentence) {
    // 先切割句子,獲取具體的單詞信息
    String[] words = sentence.split(" ");
    List<String> wordList = new ArrayList<>();
    // 循環(huán)判斷單詞的長(zhǎng)度,先過(guò)濾出符合長(zhǎng)度要求的單詞
    for (String word : words) {
        if (word.length() > 5) {
            wordList.add(word);
        }
    }
    // 對(duì)符合條件的列表按照長(zhǎng)度進(jìn)行排序
    wordList.sort((o1, o2) -> o2.length() - o1.length());
    // 判斷l(xiāng)ist結(jié)果長(zhǎng)度,如果大于3則截取前三個(gè)數(shù)據(jù)的子list返回
    if (wordList.size() > 3) {
        wordList = wordList.subList(03);
    }
    return wordList;
}

JAVA8及之后的版本中,借助Stream流,我們可以更加優(yōu)雅的寫出如下代碼:

    /**
     * 【Stream方式】
     * 從給定句子中返回單詞長(zhǎng)度大于5的單詞列表,按長(zhǎng)度倒序輸出,最多返回3個(gè)
     *
     * @param sentence 給定的句子,約定非空,且單詞之間僅由一個(gè)空格分隔
     * @return 倒序輸出符合條件的單詞列表
     */

    public List<String> sortGetTop3LongWordsByStream(@NotNull String sentence) {
        return Arrays.stream(sentence.split(" "))
                .filter(word -> word.length() > 5)
                .sorted((o1, o2) -> o2.length() - o1.length())
                .limit(3)
                .collect(Collectors.toList());
    }

直觀感受上,Stream的實(shí)現(xiàn)方式代碼更加簡(jiǎn)潔、一氣呵成。很多的同學(xué)在代碼中也經(jīng)常使用Stream流,但是對(duì)Stream流的認(rèn)知往往也是僅限于會(huì)一些簡(jiǎn)單的filtermap、collect等操作,但JAVA的Stream可以適用的場(chǎng)景與能力遠(yuǎn)不止這些。

那么問題來(lái)了:Stream相較于傳統(tǒng)的foreach的方式處理stream,到底有啥優(yōu)勢(shì)?

這里我們可以先擱置這個(gè)問題,先整體全面的了解下Stream,然后再來(lái)討論下這個(gè)問題。

筆者結(jié)合在團(tuán)隊(duì)中多年的代碼檢視遇到的情況,結(jié)合平時(shí)項(xiàng)目編碼實(shí)踐經(jīng)驗(yàn),對(duì)Stream的核心要點(diǎn)與易混淆用法、典型使用場(chǎng)景等進(jìn)行了詳細(xì)的梳理總結(jié),希望可以幫助大家對(duì)Stream有個(gè)更全面的認(rèn)知,也可以更加高效的應(yīng)用到項(xiàng)目開發(fā)中去。

Stream初相識(shí)

概括講,可以將Stream流操作分為3種類型

  • 創(chuàng)建Stream

  • Stream中間處理

  • 終止Steam

每個(gè)Stream管道操作類型都包含若干API方法,先列舉下各個(gè)API方法的功能介紹。

  • 開始管道

主要負(fù)責(zé)新建一個(gè)Stream流,或者基于現(xiàn)有的數(shù)組、List、Set、Map等集合類型對(duì)象創(chuàng)建出新的Stream流。

API功能說(shuō)明
stream()創(chuàng)建出一個(gè)新的stream串行流對(duì)象
parallelStream()創(chuàng)建出一個(gè)可并行執(zhí)行的stream流對(duì)象
Stream.of()通過(guò)給定的一系列元素創(chuàng)建一個(gè)新的Stream串行流對(duì)象
  • 中間管道

負(fù)責(zé)對(duì)Stream進(jìn)行處理操作,并返回一個(gè)新的Stream對(duì)象,中間管道操作可以進(jìn)行疊加。

API功能說(shuō)明
filter()按照條件過(guò)濾符合要求的元素, 返回新的stream流
map()將已有元素轉(zhuǎn)換為另一個(gè)對(duì)象類型,一對(duì)一邏輯,返回新的stream流
flatMap()將已有元素轉(zhuǎn)換為另一個(gè)對(duì)象類型,一對(duì)多邏輯,即原來(lái)一個(gè)元素對(duì)象可能會(huì)轉(zhuǎn)換為1個(gè)或者多個(gè)新類型的元素,返回新的stream流
limit()僅保留集合前面指定個(gè)數(shù)的元素,返回新的stream流
skip()跳過(guò)集合前面指定個(gè)數(shù)的元素,返回新的stream流
concat()將兩個(gè)流的數(shù)據(jù)合并起來(lái)為1個(gè)新的流,返回新的stream流
distinct()對(duì)Stream中所有元素進(jìn)行去重,返回新的stream流
sorted()對(duì)stream中所有的元素按照指定規(guī)則進(jìn)行排序,返回新的stream流
peek()對(duì)stream流中的每個(gè)元素進(jìn)行逐個(gè)遍歷處理,返回處理后的stream流
  • 終止管道

顧名思義,通過(guò)終止管道操作之后,Stream流將會(huì)結(jié)束,最后可能會(huì)執(zhí)行某些邏輯處理,或者是按照要求返回某些執(zhí)行后的結(jié)果數(shù)據(jù)。

API功能說(shuō)明
count()返回stream處理后最終的元素個(gè)數(shù)
max()返回stream處理后的元素最大值
min()返回stream處理后的元素最小值
findFirst()找到第一個(gè)符合條件的元素時(shí)則終止流處理
findAny()找到任何一個(gè)符合條件的元素時(shí)則退出流處理,這個(gè)對(duì)于串行流時(shí)與findFirst相同,對(duì)于并行流時(shí)比較高效,任何分片中找到都會(huì)終止后續(xù)計(jì)算邏輯
anyMatch()返回一個(gè)boolean值,類似于isContains(),用于判斷是否有符合條件的元素
allMatch()返回一個(gè)boolean值,用于判斷是否所有元素都符合條件
noneMatch()安徽一個(gè)boolean值, 用于判斷是否所有元素都不符合條件
collect()將流轉(zhuǎn)換為指定的類型,通過(guò)Collectors進(jìn)行指定
toArray()將流轉(zhuǎn)換為數(shù)組
iterator()將流轉(zhuǎn)換為Iterator對(duì)象
foreach()無(wú)返回值,對(duì)元素進(jìn)行逐個(gè)遍歷,然后執(zhí)行給定的處理邏輯

Stream方法使用

map與flatMap

mapflatMap都是用于轉(zhuǎn)換已有的元素為其它元素,區(qū)別點(diǎn)在于:

  • map 必須是一對(duì)一的,即每個(gè)元素都只能轉(zhuǎn)換為1個(gè)新的元素

  • flatMap 可以是一對(duì)多的,即每個(gè)元素都可以轉(zhuǎn)換為1個(gè)或者多個(gè)新的元素

比如:有一個(gè)字符串ID列表,現(xiàn)在需要將其轉(zhuǎn)為User對(duì)象列表??梢允褂胢ap來(lái)實(shí)現(xiàn):

/**
 * 演示map的用途:一對(duì)一轉(zhuǎn)換
 */

public void stringToIntMap() {
    List<String> ids = Arrays.asList("205","105","308","469","627","193","111");
    // 使用流操作
    List<Integer> results = ids.stream()
            .map(s -> Integer.valueOf(s))
            .collect(Collectors.toList());
    System.out.println(results);
}

執(zhí)行之后,會(huì)發(fā)現(xiàn)每一個(gè)元素都被轉(zhuǎn)換為對(duì)應(yīng)新的元素,但是前后總元素個(gè)數(shù)是一致的:

[User{id='205'}, 
 User{id='105'},
 User{id='308'}, 
 User{id='469'}, 
 User{id='627'}, 
 User{id='193'}, 
 User{id='111'}]

再比如:現(xiàn)有一個(gè)句子列表,需要將句子中每個(gè)單詞都提取出來(lái)得到一個(gè)所有單詞列表。這種情況用map就搞不定了,需要flatMap上場(chǎng)了:

public void stringToIntFlatmap() {
    List<String> sentences = Arrays.asList("hello world","Jia Gou Wu Dao");
    // 使用流操作
    List<String> results = sentences.stream()
            .flatMap(sentence -> Arrays.stream(sentence.split(" ")))
            .collect(Collectors.toList());
    System.out.println(results);
}

執(zhí)行結(jié)果如下,可以看到結(jié)果列表中元素個(gè)數(shù)是比原始列表元素個(gè)數(shù)要多的:

[hello, world, Jia, Gou, Wu, Dao]

這里需要補(bǔ)充一句,flatMap操作的時(shí)候其實(shí)是先每個(gè)元素處理并返回一個(gè)新的Stream,然后將多個(gè)Stream展開合并為了一個(gè)完整的新的Stream,如下:

peek和foreach方法

peekforeach,都可以用于對(duì)元素進(jìn)行遍歷然后逐個(gè)的進(jìn)行處理。

但根據(jù)前面的介紹,peek屬于中間方法,而foreach屬于終止方法。這也就意味著peek只能作為管道中途的一個(gè)處理步驟,而沒法直接執(zhí)行得到結(jié)果,其后面必須還要有其它終止操作的時(shí)候才會(huì)被執(zhí)行;而foreach作為無(wú)返回值的終止方法,則可以直接執(zhí)行相關(guān)操作。

public void testPeekAndforeach() {
    List<String> sentences = Arrays.asList("hello world","Jia Gou Wu Dao");
    // 演示點(diǎn)1: 僅peek操作,最終不會(huì)執(zhí)行
    System.out.println("----before peek----");
    sentences.stream().peek(sentence -> System.out.println(sentence));
    System.out.println("----after peek----");
    // 演示點(diǎn)2: 僅foreach操作,最終會(huì)執(zhí)行
    System.out.println("----before foreach----");
    sentences.stream().forEach(sentence -> System.out.println(sentence));
    System.out.println("----after foreach----");
    // 演示點(diǎn)3:peek操作后面增加終止操作,peek會(huì)執(zhí)行
    System.out.println("----before peek and count----");
    sentences.stream().peek(sentence -> System.out.println(sentence)).count();
    System.out.println("----after peek and count----");
}

輸出結(jié)果可以看出,peek獨(dú)自調(diào)用時(shí)并沒有被執(zhí)行、但peek后面加上終止操作之后便可以被執(zhí)行,而foreach可以直接被執(zhí)行:

----before peek----
----after peek----
----before foreach----
hello world
Jia Gou Wu Dao
----after foreach----
----before peek and count----
hello world
Jia Gou Wu Dao
----after peek and count----

filter、sorted、distinct、limit

這幾個(gè)都是常用的Stream的中間操作方法,具體的方法的含義在上面的表格里面有說(shuō)明。具體使用的時(shí)候,可以根據(jù)需要選擇一個(gè)或者多個(gè)進(jìn)行組合使用,或者同時(shí)使用多個(gè)相同方法的組合

public void testGetTargetUsers() {
    List<String> ids = Arrays.asList("205","10","308","49","627","193","111""193");
    // 使用流操作
    List<Dept> results = ids.stream()
            .filter(s -> s.length() > 2)
            .distinct()
            .map(Integer::valueOf)
            .sorted(Comparator.comparingInt(o -> o))
            .limit(3)
            .map(id -> new Dept(id))
            .collect(Collectors.toList());
    System.out.println(results);
}

上面的代碼片段的處理邏輯很清晰:

  1. 使用filter過(guò)濾掉不符合條件的數(shù)據(jù)

  2. 通過(guò)distinct對(duì)存量元素進(jìn)行去重操作

  3. 通過(guò)map操作將字符串轉(zhuǎn)成整數(shù)類型

  4. 借助sorted指定按照數(shù)字大小正序排列

  5. 使用limit截取排在前3位的元素

  6. 又一次使用map將id轉(zhuǎn)為Dept對(duì)象類型

  7. 使用collect終止操作將最終處理后的數(shù)據(jù)收集到list中

輸出結(jié)果:

[Dept{id=111},  Dept{id=193},  Dept{id=205}]

簡(jiǎn)單結(jié)果終止方法

按照前面介紹的,終止方法里面像count、max、min、findAnyfindFirst、anyMatch、allMatch、nonneMatch等方法,均屬于這里說(shuō)的簡(jiǎn)單結(jié)果終止方法。所謂簡(jiǎn)單,指的是其結(jié)果形式是數(shù)字、布爾值或者Optional對(duì)象值等。

public void testSimpleStopOptions() {
    List<String> ids = Arrays.asList("205""10""308""49""627""193""111""193");
    // 統(tǒng)計(jì)stream操作后剩余的元素個(gè)數(shù)
    System.out.println(ids.stream().filter(s -> s.length() > 2).count());
    // 判斷是否有元素值等于205
    System.out.println(ids.stream().filter(s -> s.length() > 2).anyMatch("205"::equals));
    // findFirst操作
    ids.stream().filter(s -> s.length() > 2)
            .findFirst()
            .ifPresent(s -> System.out.println("findFirst:" + s));
}

執(zhí)行后結(jié)果為:

6
true
findFirst:205

避坑提醒

這里需要補(bǔ)充提醒下,一旦一個(gè)Stream被執(zhí)行了終止操作之后,后續(xù)便不可以再讀這個(gè)流執(zhí)行其他的操作了,否則會(huì)報(bào)錯(cuò),看下面示例:

public void testHandleStreamAfterClosed() {
    List<String> ids = Arrays.asList("205""10""308""49""627""193""111""193");
    Stream<String> stream = ids.stream().filter(s -> s.length() > 2);
    // 統(tǒng)計(jì)stream操作后剩余的元素個(gè)數(shù)
    System.out.println(stream.count());
    System.out.println("-----下面會(huì)報(bào)錯(cuò)-----");
    // 判斷是否有元素值等于205
    try {
        System.out.println(stream.anyMatch("205"::equals));
    } catch (Exception e) {
        e.printStackTrace();
    }
    System.out.println("-----上面會(huì)報(bào)錯(cuò)-----");
}

執(zhí)行的時(shí)候,結(jié)果如下:

6
-----下面會(huì)報(bào)錯(cuò)-----
java.lang.IllegalStateExceptionstream has already been operated upon or closed
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:229)
    at java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:449)
    at com.veezean.skills.stream.StreamService.testHandleStreamAfterClosed(StreamService.java:153)
    at com.veezean.skills.stream.StreamService.main(StreamService.java:176)
-----上面會(huì)報(bào)錯(cuò)-----

因?yàn)閟tream已經(jīng)被執(zhí)行count()終止方法了,所以對(duì)stream再執(zhí)行anyMatch方法的時(shí)候,就會(huì)報(bào)錯(cuò)stream has already been operated upon or closed,這一點(diǎn)在使用的時(shí)候需要特別注意。

結(jié)果收集終止方法

因?yàn)镾tream主要用于對(duì)集合數(shù)據(jù)的處理場(chǎng)景,所以除了上面幾種獲取簡(jiǎn)單結(jié)果的終止方法之外,更多的場(chǎng)景是獲取一個(gè)集合類的結(jié)果對(duì)象,比如List、Set或者HashMap等。

這里就需要collect方法出場(chǎng)了,它可以支持生成如下類型的結(jié)果數(shù)據(jù):

  • 一個(gè)集合類,比如List、Set或者HashMap等

  • StringBuilder對(duì)象,支持將多個(gè)字符串進(jìn)行拼接處理并輸出拼接后結(jié)果

  • 一個(gè)可以記錄個(gè)數(shù)或者計(jì)算總和的對(duì)象(數(shù)據(jù)批量運(yùn)算統(tǒng)計(jì)

生成集合

應(yīng)該算是collect最常被使用到的一個(gè)場(chǎng)景了:

public void testCollectStopOptions() {
    List<Dept> ids = Arrays.asList(new Dept(17), new Dept(22), new Dept(23));
    // collect成list
    List<Dept> collectList = ids.stream().filter(dept -> dept.getId() > 20)
            .collect(Collectors.toList());
    System.out.println("collectList:" + collectList);
    // collect成Set
    Set<Dept> collectSet = ids.stream().filter(dept -> dept.getId() > 20)
            .collect(Collectors.toSet());
    System.out.println("collectSet:" + collectSet);
    // collect成HashMap,key為id,value為Dept對(duì)象
    Map<Integer, Dept> collectMap = ids.stream().filter(dept -> dept.getId() > 20)
            .collect(Collectors.toMap(Dept::getId, dept -> dept));
    System.out.println("collectMap:" + collectMap);
}

結(jié)果如下:

collectList:[Dept{id=22}, Dept{id=23}]
collectSet:[Dept{id=23}, Dept{id=22}]
collectMap:{22=Dept{id=22}, 23=Dept{id=23}}

生成拼接字符串

將一個(gè)List或者數(shù)組中的值拼接到一個(gè)字符串里并以逗號(hào)分隔開,這個(gè)場(chǎng)景相信大家都不陌生吧?

如果通過(guò)for循環(huán)和StringBuilder去循環(huán)拼接,還得考慮下最后一個(gè)逗號(hào)如何處理的問題,很繁瑣:

public void testForJoinStrings() {
    List<String> ids = Arrays.asList("205""10""308""49""627""193""111""193");
    StringBuilder builder = new StringBuilder();
    for (String id : ids) {
        builder.append(id).append(',');
    }
    // 去掉末尾多拼接的逗號(hào)
    builder.deleteCharAt(builder.length() - 1);
    System.out.println("拼接后:" + builder.toString());
}

但是現(xiàn)在有了Stream,使用collect可以輕而易舉的實(shí)現(xiàn):

public void testCollectJoinStrings() {
    List<String> ids = Arrays.asList("205""10""308""49""627""193""111""193");
    String joinResult = ids.stream().collect(Collectors.joining(","));
    System.out.println("拼接后:" + joinResult);
}

兩種方式都可以得到完全相同的結(jié)果,但Stream的方式更優(yōu)雅:

拼接后:205,10,308,49,627,193,111,193

數(shù)據(jù)批量數(shù)學(xué)運(yùn)算

還有一種場(chǎng)景,實(shí)際使用的時(shí)候可能會(huì)比較少,就是使用collect生成數(shù)字?jǐn)?shù)據(jù)的總和信息,也可以了解下實(shí)現(xiàn)方式:

public void testNumberCalculate() {
    List<Integer> ids = Arrays.asList(1020304050);
    // 計(jì)算平均值
    Double average = ids.stream().collect(Collectors.averagingInt(value -> value));
    System.out.println("平均值:" + average);
    // 數(shù)據(jù)統(tǒng)計(jì)信息
    IntSummaryStatistics summary = ids.stream().collect(Collectors.summarizingInt(value -> value));
    System.out.println("數(shù)據(jù)統(tǒng)計(jì)信息: " + summary);
}

上面的例子中,使用collect方法來(lái)對(duì)list中元素值進(jìn)行數(shù)學(xué)運(yùn)算,結(jié)果如下:

平均值:30.0
總和:IntSummaryStatistics{count=5, sum=150min=10, average=30.000000max=50}

并行Stream

機(jī)制說(shuō)明

使用并行流,可以有效利用計(jì)算機(jī)的多CPU硬件,提升邏輯的執(zhí)行速度。并行流通過(guò)將一整個(gè)stream劃分為多個(gè)片段,然后對(duì)各個(gè)分片流并行執(zhí)行處理邏輯,最后將各個(gè)分片流的執(zhí)行結(jié)果匯總為一個(gè)整體流。

約束與限制

并行流類似于多線程在并行處理,所以與多線程場(chǎng)景相關(guān)的一些問題同樣會(huì)存在,比如死鎖等問題,所以在并行流終止執(zhí)行的函數(shù)邏輯,必須要保證線程安全。

回答最初的問題

到這里,關(guān)于JAVA Stream的相關(guān)概念與用法介紹,基本就講完了。我們?cè)侔呀裹c(diǎn)切回本文剛開始時(shí)提及的一個(gè)問題:

Stream相較于傳統(tǒng)的foreach的方式處理stream,到底有啥優(yōu)勢(shì)?

根據(jù)前面的介紹,我們應(yīng)該可以得出如下幾點(diǎn)答案:

  • 代碼更簡(jiǎn)潔、偏聲明式的編碼風(fēng)格,更容易體現(xiàn)出代碼的邏輯意圖

  • 邏輯間解耦,一個(gè)stream中間處理邏輯,無(wú)需關(guān)注上游與下游的內(nèi)容,只需要按約定實(shí)現(xiàn)自身邏輯即可

  • 并行流場(chǎng)景效率會(huì)比迭代器逐個(gè)循環(huán)更高

  • 函數(shù)式接口,延遲執(zhí)行的特性,中間管道操作不管有多少步驟都不會(huì)立即執(zhí)行,只有遇到終止操作的時(shí)候才會(huì)開始執(zhí)行,可以避免一些中間不必要的操作消耗

當(dāng)然了,Stream也不全是優(yōu)點(diǎn),在有些方面也有其弊端:

  • 代碼調(diào)測(cè)debug不便

  • 程序員從歷史寫法切換到Stream時(shí),需要一定的適應(yīng)時(shí)間

總結(jié)

好啦,關(guān)于JAVA Stream的理解要點(diǎn)與使用技能的闡述就先到這里啦。那通過(guò)上面的介紹,各位小伙伴們是否已經(jīng)躍躍欲試了呢?快去項(xiàng)目中使用體驗(yàn)下吧!當(dāng)然啦,如果有疑問,也歡迎找我一起探討探討咯。



往期推薦

我的學(xué)習(xí)小圈子

這是用框架的通病么?

前端發(fā)展趨勢(shì)預(yù)測(cè) !

這幾個(gè)插件,讓你的 vscode 更牛逼!

TCP 和 UDP 能共用一個(gè)端口嗎?

瀏覽 38
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲一级A片| 亚洲精品美女| 牛牛精品视频| 黄片免费观看视频| 蜜桃av在线播放| 肏屄在线视频| 久久婷婷五月综合| 波多野结衣无码流出| 性猛交╳XXX乱大交| 中文资源在线√8| 天天操视频网站| 中文字幕av久久爽爽| 亚洲人妻无码视频| 久久av电影| 俺来也俺去啦欧美www| 欧美一级片免费观看| www.插插| 国产剧情91| 国精产品一品二品国精| 成人免费无码婬片在线| 日韩三级片av| 高清免费在线中文Av| 一级黄色A片视频| 黄色日逼网站| 国产无码中文字幕| 欧美一区二区无码视频| 国产久久视频在线观看| 日本一区二区视频在线| 免费无码一区| 国产激情久久| 久操视频在线| 小黄片在线免费观看| 久久久国产精品在线| 免费成人三级片| 探花AV| 操b在线| 黄色天堂天天看| 亚洲综合免费观看高清完整版在线观| 黄片视频观看| 密臀AV在线| 91女人18毛片水多的意思 | 亚洲中文字幕观看| а√最新版天堂中文在线| 亚洲无码免费看| 国产av探花| 尻屄视频网站| 国内精品一区二区三区| 成人欧美大片黄18| 五月天色色婷婷| 日韩在线免费看| 熟女在线视频| 日韩人妻在线观看| 法国《少女日记》电影| 夜夜撸一撸| 91久久免费视频| 午夜成人黄片| 精品一区二区三区毛片| 国产一区二区三区四区在线观看| 美女黄色网| 人人看人人摸人人| 欧美aaaaaa| 精品无码一区二区三区在线| 婷婷六月综合| 免费在线a| 大香蕉在线视频观看| 免费观看高清无码| 无码a区| 亚洲精品欧美久久婷婷| 黄色毛片网| 狠狠综合网| 3D动漫精品啪啪一区二区免费| AV影音在线| 99精品视频16在线免费观看| 无码精品人妻一区二区三区漫画| 日韩免费在线视频观看| 91综合视频在线播放| 色婷婷在线无码精品秘人口传媒 | 内射黄片| 男人的天堂免费视频| 伊人天天干| 激情无码网站| 高清无码在线视频观看| 日朝无码| www.av在线播放| 97亚洲精品| 91在线网站| 精品国产一级A片黄毛网站 | 无码精品一区二区三区同学聚会| 国产精品成人3p一区二区三区| 五月天婷婷丁香网| 色综合99| 免费在线a视频| 久久久久久久91| 杨晨晨不雅视频| 人妻夜夜爽天天爽| 日韩特级片| 日本无码片| 亚洲精品伊人| 青青草无码成人AV片| 搡bbbb| 无码操| 国产精品午夜在线观看| 国产精品高潮无套内谢| 天天干夜夜爽| 一个人看的www日本高清视频 | 日韩三级AV| 亚洲五月婷婷| 婷婷五月色综合| 黄色精品视频| 中文字幕免费无码| 中文字幕二区| 国产福利电影在线| 中文字幕在线不卡| 三级片网站国产| A视频免费观看| 久久久久久久香蕉视频| 偷拍-91爱爱| 亚洲在线视频观看| 日韩视频二区| 日韩一级网站| wwwxx国产| 91人妻人人爽| 中文字幕中文字幕无码| 亚洲精品资源| 亚洲毛片亚洲毛片亚洲毛片| 夜夜爽久久精品91| 超碰人人人人人人人人| 无码视频在线观看免费| 18禁无码网站| 欧美性猛交XXXX乱大交3| 人人操人人爱人人妻| 日韩人妻一区| 国产探花一区二区三区| 黄色电影A片| 欧美视频区| 亚洲性爱一区| 超碰极品| 在线高清无码| 国产高清免费无码| 国产黄色不卡| 三级片网站在线播放| 日韩av中文在线| 在线免费观看亚洲| 波多野结衣无码NET,AV| 久久AV影院| 天堂av中文字幕| 五月天久久久| 大香蕉伊人综合在线| 亚洲人妻中文字幕| 亚洲视频精品| 天天搞天天曰在线观看| 日韩高清无码人妻| 色老师综合| 久久综合五月| 日韩在线观看中文字幕| 欧美性生活| 免费欧美性爱视频| 欧美日韩肏屄视频| 国产黄片视频| 人妻体内射精一区二区三区| 国产女人水真多18毛片18精品 | 黄色A片视频| 特黄特色大片BBBB| 又粗又硬又爽18级A片| 3D动漫精品啪啪一区二区下载| 翔田千里在线观看| 青青草东路热vv| 操片| 99免费热视频在线| 久久99影院| 久草热在线| 青青欧美| 亚洲无吗在线视频| www.51av| 毛片黄色视频| 色婷婷中文在线| 国产九九| 99人人操| 嫩BBB槡BBBB槡BBBB免费视频| 中文字幕免费在线看一区七区| 国产黄片免费在线观看| 五月天婷婷网站| 91熟女首页| 黄片无码| 五月停亭六月,六月停亭的英语| 日本黄色免费网站| 逼特逼视频在线| 国产性受XXXXXYX性爽| 日本爱爱网站| 97久久一区二区| 国产1024在线| 色色成人网| 无码专区在线观看| www.av在线播放| 亚洲AV无码成人精品| 精品乱伦视频| 亚洲精品福利视频导航| 乱伦精品| av黄页| 日韩色导航| 中文字幕有码在线视频| 欧美成人福利在线观看| 九月丁香| 久操大香蕉| 91在线网址| 国产亚洲99久久精品熟女| 午夜精品久久久久久不卡8050| 国产一级片免费观看| 国产精品久久免费| 国产又粗又大又爽| 成人在线免费视频| 一区二区三级片| 国产成人一区二区| 中文无码在线| 亚洲少妇网| 大肉大捧视频免费观看| av无码免费| 成人激情在线观看| 免费激情网站| 精品欧美激情精品一区| 亚洲无码人妻在线| 日韩免费中文字幕A片| 91精品大屁股白浆自慰久久久| 国产精品777777| 婷婷国产精品视频| 欧美不卡一区二区三区| 一区二区高清| 久久无码免费| 亚洲黄色在线观看视频| 亚洲成人无码在线播放| 欧美性猛交XXXX乱大交3| 97国产精品| 牛牛久久| 国产丰满乱子伦无码| 国产毛片网| 午夜无码电影| av福利在线观看| 亚洲精品成人网站| 国产在线精品观看| 日韩av免费| 成人激情片| 精品一区二区三区四区五区| 男人的天堂社区| 国产一级特黄A片| 亚洲国产操逼| 中文无码高清视频| 欧美精品成人在线| 欧美激情在线| 裸体黄色一极大片| 亚洲精品久久久久毛片A级绿茶 | 天天操天天日天天射| 欧美一级黄| 国产熟妇| 91精品国产综合久久久蜜臀图片| 天天爽天天摸| 国产精品无码白浆高潮| 九七影院第二页| 国产一区二区不卡视频| 先锋影音av资源站| 特级西西WWW888| 国产欧美视频在线| 人人看人人艹| 强伦轩一区二区三区四区| 热逼视频| 午夜亚洲视频| 久久综合五月天| 日韩一级a片| 午夜AV免费| 五月丁香花视频| 啪啪视频免费观看| 亚洲AVwww| 色五月婷婷婷| 黃色级A片一級片| 一级性爱视频| 国产福利在线导航| 日一日射一射| 人人看人人摸人人操| 黄色美女毛片| 国产经典午夜福利视频合集| 五月天婷婷色| 亚洲一区图片| 久久只有精品| 成人777| 日欧一级片| 香蕉国产2023| 日韩91| 欧美色精品| 久久涩| 日韩精品视频在线| 四川性BBB搡BBB爽爽爽小说| 国产99久久九九精品无码免费| 99久久综合| 69激情网| 欧美激情无码一区二区三区张丽| 熟女无码| 爱爱爱爱网| 97福利在线| 日逼视频| 婷婷五月天丁香在线| 五月天狠狠干| 亚洲成人福利在线| 91成人网站| 国产激情精品| 色老师综合| 大地资源38页| 欧美精品久久久久久久多人混战| 豆花成人网站在线看| 97三级| 色999网址| 久久久久久9| 国产在线拍揄自揄拍无码福利| 国产成人精品a区在线观看| 自拍偷拍| 国产a视频| 波多野结衣av一区| 91网站免费在线观看| 淫荡五月天视频导航| 久草视频这里只有精品| 91小宝寻花一区二区三区三级| 日韩中文字幕成人| 亚洲视频网站在线观看| 先锋AV资源| 成人性爱视频免费观看| 91丨熟女丨首页| 欧美亚洲成人网站| 一级片免费网站| 99精品视频在线| 亚洲不卡一区二区三区| 中文字幕人妻丰满熟妇| 91麻豆国产福利精品| 久久艹网| 国产操逼网| 久久波多野结衣一区二区| 伊人久久网站| a亚洲a| 男人天堂色男人| 日韩AA视频| 亚洲无码视频看看| 青春草视频在线观看| 成人精品一区日本无码网站suv/| 粉粉嫩嫩的18虎白女| 亚洲精品A片| 日韩一级二级三级| 黄色大片AV在线| 99re国产视频| 91精品久久人妻一区二区夜夜夜| 无码人妻AV一区| 午夜黄色影院| 欧美精品操逼| 无码操B| 在线观看2区| 懂色av懂色av粉嫩av无码| 九九九精品| 粉嫩小泬BBBBBB免费看| 高潮视频在线观看| 国产91久久婷婷一区二区| www.911国产| 欧美va亚洲va| 99热中文| 国产精品伊人| 五十路av| 爱福利视频网| 成人一区在线观看| 色色婷婷五月天| 五月停亭六月,六月停亭的英语| 美女黄网站| 久久精品999| 91大铭哥| 三级片一区| 亚洲AV无码成人网站国产网站| 亚洲国产熟妇无码日韩| 日韩在线1| 亚洲成人AV在线播放| 久操手机在线| 曰韩毛片| 爱射网| 日韩动态图| 精品免费在线| 91九色蝌蚪| 亚洲少妇熟女| 欧美韩日高清精彩视频| 欧美性爱一级| 国产欧美在线观看不卡| 7777影视电视剧在线观看官网| 九九成人免费视频| 色五月综合| 国产卡一卡二在线| 麻豆一区二区三区| 日韩av高清| 国产精品怡红院有限公司| 91爱搞| 色五月视频在线| 亚洲综合91| 成人黄色免费在线| 亚洲在线免费| 视色视频在线观看18| 亚洲国产精品成人va在线观看 | 成人免费视频一区二区| 国产无码在线影院| 天天视频黄色| 国内精品人妻无码久久久影院蜜桃| 欧美中文字幕在线视频| 中文字幕无码影院| 国产精品大香蕉| 91无码高清| 国产精品一级二级三级| 美女网站在线观看| av天堂资源在线| 91免费视频网站| 人人射人人爱| 在线A∨视频| 九色PORNY国产成人| 欧美性综合网| 51无码| 亚洲无码www| 做aAAAAA免费视频| 亚洲天堂视频在线| 亚洲天堂成人在线| 北条麻妃一区二区三区| 欧美另类色| 国产熟妇搡BBBB搡BBBB搡| 91丨九色丨东北熟女| 亚洲精品一区二区三区无码电影| 国产无套在线| 无码AV一区| 西欧超碰在线| 国产操B视频| 五月婷色| 亚洲精品乱码在线| 中文一级片| 亚洲男人的天堂网| 九九性视频| 国产三级片在线免费观看| 成人网站AV| 日韩国产欧美精品一区| 俺也去也| 青青操日日干| 亚洲视频在线观看| 日韩VA| av无码av天天av天天爽| 黄色成人在线观看| 国产成人精品av| 欧美一级片网站| 操操操操操| 亚洲无码入口| 西西888WWW大胆视频| 波多野结衣无码视频在线观看 | 亚洲AV无码精品国产| 欧美视频A| 中文字幕AV在线观看| 午夜天堂精品久久久| 大鸡巴视频在线| 久久久国产91桃色一区二区三区| 高清无码在线视频观看| 欧美日韩操逼片| 操人人| 久久国产热视频| 国产三级黄色片| 精品国产99| 欧美日韩亚洲视频| 在线观看AⅤ| 在线中文字幕网站| 欧美黄色成人网站| 欧美日韩无| 国产精品天天AVJ精麻传媒| 日韩成人无码人妻| 影音先锋色AV| 日本三级AAA三级AAAA97| 性无码一区二区三区| 99er在线观看视频| 手机在线一区| 国内久久| 欧美女人操逼| 国产精品久久久久久久9999| 免费看一级高潮毛片| 久久久噜噜噜久久中文字幕色伊伊| 91逼站| 青青草手机视频在线| 人妻综合网| 插插插菊花综合网| 麻酥酥在线视频| 黄片网站免费观看| 91精品大屁股白浆自慰久久久 | 人妻少妇av中文字幕乱码牛牛| 日本高清黄色视频| 在线天堂999| 国产免费高清无码| 黄色电影免费在线观看| 久久99嫩草熟妇人妻蜜臀| 国产精品美女在线观看| 免费一级黄色毛片| 成人网站免费在线| 亚洲黄色视频免费看| 色色五月丁香| 综合五月婷婷| 免费三级网址| 2025av在线| 成人AV午夜福利| 特黄AAAAAAAA片视频| 五月婷婷六月激情| 日韩h视频| 免费观看黄片网站| 欧美日本成人网站入口| 影音先锋男人资源站| 永久免费黄色视频| 亚洲加勒比久久88色综合| 国内成人精品网站| 操逼一级片| 国产精品77777| 人妻黑人一区二区三区| 无码不卡一区| 99re| 操小骚逼视频| 插逼视频网站| 精品一区二区免费| 在线观看免费欧美操逼视频| 国产激情视频在线观看| 91成人在线免费视频| 狼友自拍| 精品国产一级A片黄毛网站| 在线你懂的| 俺来也俺就去www色情网| 熟妇女人妻丰满少妇中文字幕| 精品AAA| 国产91在线中日| 久久久亚洲无码| 中文字幕AⅤ在线| 色骚综合| 国产精品自拍在线观看| 人妻丝袜蕾丝高跟双飞| 午夜成人福利电影| 国产免费一区| 性生活无码| 人人妻人人躁人人DVD| 色综合五月| 久草天堂| 亚洲影院在线观看| 九九香蕉视频| 男女av免费观看| 大香蕉尹人在线视频| AV天堂影视在线观看| 亚洲v在线| 中日韩免费视频| 亚洲字幕av| 成人18视频| 五十路義母| 亚洲黄色片| 欧美精品成人| 五月天婷婷基地| 在线观看免费黄色| 日韩精品一区二区亚洲AV观看| 夜色福利在线看| 日韩成人精品中文字幕| 日韩欧美在线视频观看| 欧美亚洲日韩中文字幕| 国产骚女| 青青草娱乐视频| 日本一区二区三区视频在线观看 | 翔田千里中文字幕无码| 在线免费黄色网址| 91精产国品一二| 综合网亚洲| 无码精品人妻一区二区三区漫画| 亚洲av图片| 亚洲少妇熟女| 无码人妻一区二区三一区免费n狂飙 | 丝袜一区| 蜜桃视频在线观看视频| 色婷婷国产精品视频| 午夜福利h| 黄色大片av| 欧美成人视频18| 永久黄网站| 中国老熟女重囗味HDXX| 一区二区无码区| 欧美熟妇BBB搡BBB| 久久久77| 国产真人无码| 中文无码字幕视频| 黄片在线免费观看| 亚洲成人三区| 日韩精品不卡| 18禁网站免费| 激情免费视频| 亚洲先锋影音| 欧美性猛交ⅩXXX乱大交| 日韩AV无码高清| www91久久| 日本久久久久久久久视频在线观看 | 逼逼75大秀| 久久久性爱| 91日韩欧美| 不卡av在线| 色婷婷免费视频| 99re免费视频| 久久理论| 日韩成人三级片| 黑人亚洲娇小videos∞| 女邻居的B好大| 亚洲jiZZjiZZ日本少妇| 天天夜夜爽| 手机看片福利一区二区| 亚洲成人视频在线观看| 天天爽日日澡AAAA片| 中文字幕第98页| 一本一道无码免费看视频| 乱伦一级| 欧美操逼网址| 黄色无码av| 久久香蕉网站| 成人永久免费视频| 男人的天堂视频在线| www.av在线播放| 思思热99热| 性爱一级视频| AⅤ中文字幕在线免费观看 | 亚洲成人三级片| 最好看的MV中文字幕国语| 色呦呦一区二区三区| 亚洲香蕉在线视频| 日韩婬乱片A片AAA真人视频| 午夜福利视频网| 三级片男人的天堂| 亚洲大片在线观看| 天天色粽合合合合合合合| 亚洲毛片亚洲毛片亚洲毛片| 黄色电影AV| 成人a电影| 成人性生交大片免费看小芳| 国产寡妇亲子伦一区二区三区四区| 啊啊嗯嗯视频| 精品AV无码一区二区三区| 朝鲜性感AV在线| 国产成人精品八戒| 国产精品大香蕉| 中文字字幕在线中文乱码更新时间 | 天天舔天天干| 91人妻人人澡人人爽人人玩| 好男人一区二区三区在线观看| 伊人大香焦网| 丰满人妻一区二区三区46| 超碰91人人操| 综综综综合网| 性猛交AAAA片免费观看直播| 亚洲无码你懂的| 日本色影院| 性欧美丰满熟妇XXXX性久久久| 欧美,日韩,中文字幕| A级毛片网站| 水果派成人播放无码| 美日韩一区二区| 国产精品乱码毛片在线人与| 龙泽美曦土豪| 激情小说亚洲图片:伦| 国外成人在线视频老鸭窝| 中文字幕日本电影| 在线成人小视频| 日本黄在线播放| 豆花无码视频一区二区| 色久悠悠综合网| 欧美aⅤ| 黄片网址在线观看| 性爱AV网| AV大片免费看| 免费色色网站| 2021天天夜日| 日韩无码AV中文字幕| 青草久久网| 久久国产亚洲| 欧美日韩在线视频免费观看| ww免费视频| 日韩在线视频中文字幕码无| 中文解说AⅤ水果派| 亚洲无码观看视频| 99久久99九九九99九他书对| 日本精品在线视频| 午夜男女福利| 人人妻人人爽人人精品| 日韩精品成人电影| 口爆在线观看| 日逼视频免费观看| 欧美性爱在线观看| 亚洲免费在线| 亚洲av不卡| 日本久久婷婷| 69精品免费视频| 日日夜夜天天综合| 久久无码人妻精品一区二区三区| 久久超碰99| 黄色视频日本免费| 91干干| 欧美亚洲成人视频| 色老板视频在线观看| 俺也去AV| 欧美精品91| 色欲插插| 亚洲一级av| 内射在线播放| 色人阁人妻中文字幕| 日韩无码高清免费视频| 刘玥精品A片在线观看| 在线观看中文字幕亚洲| 欧美特级黄| 91精品婷婷国产综合久久蝌蚪| 成人无码观看| 午夜福利成人网站| 波多野结衣高清无码视频| 国产精品国产精品国产专区| 亚洲日韩第一页| 在线观看黄色视频网站| 女生自慰在线观看| 欧美成人看片| 国精产品一区二区三区在线观看| 欧美三级欧美一级| 日韩精品极品视频在线观看免费| 亚洲视频福利| 高清无码视频18| jizz视频| 国产精品成人午夜福利| 成人激情视频在线观看| 国产高清秘成人久久| 97这里只有精品| 大香蕉尹人在线视频| 亚洲毛片亚洲毛片亚洲毛片| 亚洲黄色免费观看| 亚洲精品中文字幕乱码三区91| 国产一级女婬乱免费看| 色九九综合| 蜜桃视频一区| 亚洲无码在线观看视频| 做爱网站在线观看| 免费看片av| 色色三区| 牛牛精品一区二区| 好吊妞在线| 91综合视频| 日韩人妻丰满无码区A片| 九九中文字幕| 做爱A片| 色婷婷一二三精品A片| 影音先锋女人av噜噜色| 久久99久久99精品免视看婷婷 | 三浦恵子一级婬片A片| 欧美国产三级| 五月丁香婷中文| 农村A片婬片AAA毛片| 久久91| 国产一级特黄| 丁香婷婷五月基地| 人妻制服丝袜| 成人在线免费网站| 91在线无码精品秘入口| 91探花秘在线播放| 亚洲午夜精品久久久久久APP| 男女一区二区三区| 欧美三级理论片| 超碰久操| 69黄色视频| 亚洲一级电影| 91N视频| 伊人久久五月| 亚洲电影在线| 亚洲福利网站| 成人黄色电影在线观看| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV | 黄色AV网| 特级西西444www高清| 99热这里有精品| 少妇搡BBBB搡BBB搡毛片| chinese高潮老女人| 处破女初破全过免费看| 99涩涩| 国产九九| 精品孕妇一级A片免费看| 无码AV电影在线观看| 久久女人网| 欧美精品无码| 亚洲欧美成人在线| 国产人成视频免费观看| 日本99视频| 国产精品免费观看久久久久久久久| 国产17c精品视频一二三区| 神马午夜福利视频| 久久91人妻无码精品蜜桃HD| 人人摸人人操人人爱| 一级特黄妇女高潮AA片免费播放| 亚洲中文字幕一| 久久九| 日韩在线欧美在线| 成年视频在线观看| 亚洲男人的天堂网| www.亚洲精品| 影音先锋一区二区| 麻豆传媒av| 丁香六月婷婷综合缴| va在线| 欧美色图在线播放| 國模久久| 亚洲无码人妻在线| 熟妇女人妻丰满少妇中文字幕| 大色网小色网| 欧美黄片免费看| www.欧美精品| 成人理伦A级A片在线论坛| 免费视频二区| 一区二区精品| 第四色色综合| 国产精品精品精品| 粉嫩av懂色av蜜臀av分享| 日韩福利视频| 成人A视频| 97精品人妻一区二区| 大荫蒂hd大荫蒂视频| 成人在线网| 欧美三级在线观看视频| 在线视频你懂| 人妻少妇一区| 国精产品秘一区二区-| 国产欧美精品AAAAAA片| 亚洲无码专区视频| www.亚洲精品| 成人福利视频| 亚洲黄色视频在线免费观看 | 美日韩在线| 日韩中文在线视频| 色墦五月丁香| 日韩欧美偷拍| 免费看黄在线看| 欧美在线网站| 蝌蚪窝在线免费观看视频| 新超碰97| 99人人操| 开心激情站| 日本免费在线观看视频| 91青青草在线| 加勒比综合| 日韩一级电影在线| 99久热在线精品| 插菊花综合网3| 国产三级电影| 涩涩视频成人| 97爱爱爱| 97资源在线| 狼友视频免费观看| 四虎成人无码A片观看| eeuss一区| 超碰天天干天天摸| 久久精品苍井空免费一区| 蜜桃AV在线播放| 亚洲黄色片| 欧美一级三级| 亚洲三级黄色| 欧美日韩一区二区三区| 无码人妻丰满熟妇区17水蜜桃| 亚洲精品69| 蝌蚪窝视频在线观看| 成人毛片在线大全免费| 黄色无码av| 91在线精品一区二区| 日韩无码黄色片| 成人视频18+在线观看| 九九性爱视频| 激情小视频国产在线播放| 亚洲黄色在线观看视频| 无码AV一区| 一本大道香蕉av久久精东影业| 中国精品77777777| 国产香蕉在线观看| 国产91视频| 国产理论在线| 中文字幕日韩视频| 天天视频色版免费观看视频| 亚洲第一成人久久网站| 丁香九月婷婷| 欧美91熟| 欧美老女人操逼视频| 国产精品综合激情| 国产AV日韩AⅤ亚洲AV中文| AV色图| 亚洲视频免费播放| 欧美日韩四区| 欧美日韩亚洲天堂| 外国一级片| AV资源网站在线| 亚洲欧美日韩高清| 久色伊人| 九九综合精品| 亚洲无码123| 成人网站在线看| 久久久精品中文字幕麻豆发布| 操逼视频观看| www一个人免费观看视频www| 2024国产精品| 一区日韩| 最新中文字幕在线播放| 人人摸人人操人人射| 插插视频| 女邻居的B好大| 亚洲av免费在线| 一本色道88久久加勒比精品|