精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深度掌握 Java Stream 流操作,讓你的代碼高出一個逼格!

開發(fā) 前端
所謂并行,指的是多個任務在同一時間點發(fā)生,并由不同的cpu進行處理,不互相搶占資源;而并發(fā),指的是多個任務在同一時間點內同時發(fā)生了,但由同一個cpu進行處理,互相搶占資源。

一、介紹

我們都知道,從 Java8 開始,jdk 新增加了一個 Stream 類,用來補充集合類,它的強大,相信用過它的朋友,能明顯的感受到,不用使用for循環(huán)就能對集合作出很好的操作。

Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。

這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 并且可以在管道的節(jié)點上進行處理, 比如篩選, 排序,聚合等。

元素流在管道中經(jīng)過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結果。

操作流程如下:

+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+

采用 Stream API 可以極大提高 Java 程序員的生產(chǎn)力,讓程序員寫出高效率、干凈、簡潔的代碼。

下面,我們就以實際的日常開發(fā)編程風格做對比,學習完 Stream 的編程風格之后,我敢保證,你會愛上它!

二、遍歷操作

2.1、遍歷集合

日常開發(fā)中,我們經(jīng)常需要需要遍歷集合對象中的元素,例如,我們會采用如下方式進行遍歷元素,然后過濾出某個字段的集合,jdk7 的操作:

/**
 * jdk7 從集合對象中獲取用戶ID集合
 * @param userList
 * @return
 */
public List<Long> getUserIds(List<User> userList){
    List<Long> userIds = new ArrayList<>();
    for (User user : userList) {
        userIds.add(user.getUserId());
    }
    return userIds;
}

當采用 Stream 編程之后,只需要通過一行代碼,即可實現(xiàn):

/**
 * jdk8 從集合對象中獲取用戶ID集合
 * @param userList
 * @return
 */
public List<Long> getUserIds(List<User> userList){
    List<Long> userIds = userList.stream().map(User::getUserId).collect(Collectors.toList());
    return userIds;
}

2.2、篩選元素

篩選元素,是日常開發(fā)中經(jīng)常會碰到,例如在 jdk7,我們會這么操作:

/**
 * jdk7 從集合對象中過濾出用戶ID不為空的數(shù)據(jù)
 * @param userList
 * @return
 */
public List<Long> getUserIds7(List<User> userList){
    List<Long> userIds = new ArrayList<>();
    for (User user : userList) {
        if(user.getUserId() != null){
            userIds.add(user.getUserId());
        }
    }
    return userIds;
}

采用 Stream api,我們只需要通過filter方法來篩選出需要的數(shù)據(jù),即可過濾出用戶ID不為空的數(shù)據(jù)。

/**
 * jdk8 從集合對象中篩選出用戶ID不為空的數(shù)據(jù)
 * @param userList
 * @return
 */
public List<Long> getUserIds8(List<User> userList){
    List<Long> userIds = userList.stream().filter(item -> item.getUserId() != null).map(User::getUserId).collect(Collectors.toList());
    return userIds;
}

2.3、刪除重復的內容

如果你想對返回的集合內容排除重復的數(shù)據(jù),操作也很簡單,在合并的時候使用Collectors.toSet()即可!

/**
 * jdk8 從集合對象中篩選出用戶ID不為空的數(shù)據(jù),并進行去重
 * @param userList
 * @return
 */
public Set<Long> getUserIds(List<User> userList){
    Set<Long> userIds = userList.stream().filter(item -> item.getUserId() != null).map(User::getUserId).collect(Collectors.toSet());
    return userIds;
}

2.4、數(shù)據(jù)類型轉換

在實際的開發(fā)過程中,經(jīng)常會出現(xiàn)數(shù)據(jù)類型定義不一致的問題,例如有的系統(tǒng),使用String接受,有的是用Long,對于這種場景,我們需要將其轉換,操作也很簡單

/**
 * jdk8 將Long類型數(shù)據(jù)轉換成String類型
 * @param userIds
 * @return
 */
public List<String> getUserIds10(List<Long> userIds){
    List<String> userIdStrs = userIds.stream().map(x -> x.toString()).collect(Collectors.toList());
    return userIdStrs;
}

2.5、數(shù)組轉集合

我們還會碰到,前端傳給我們的是一個數(shù)組,但是我們需要轉成集合,采用 stream api 操作也很簡單!

public static void main(String[] args) {
        //創(chuàng)建一個字符串數(shù)組
        String[] strArray = new String[]{"a","b","c"};
        //轉換后的List 屬于 java.util.ArrayList 能進行正常的增刪查操作
        List<String> strList = Stream.of(strArray).collect(Collectors.toList());
}

三、集合轉Map操作

在實際的開發(fā)過程中,還有一個使用最頻繁的操作就是,將集合元素中某個主鍵字段作為key,元素作為value,來實現(xiàn)集合轉map的需求,這種需求在數(shù)據(jù)組裝方面使用的非常多,尤其是在禁止連表 sql 查詢操作的公司,視圖數(shù)據(jù)的拼裝只能在代碼層面來實現(xiàn)。

例如下面這段代碼,角色表里面關聯(lián)角色組ID信息,當查詢角色信息的時候,需要把角色組名稱也展示處理,采用map方式來匹配,效率會非常高。

實際代碼案例分享

//角色組ID集合
Set<Long> roleGroupIds = new HashSet<>();
//查詢所有的角色信息
List<RoleInfo> dbList = roleInfoMapper.findByPage(request);
for (RoleInfo source : dbList) {
    roleGroupIds.add(source.getRoleGroupId());
    RoleInfoDto result = new RoleInfoDto();
    BeanUtils.copyProperties(source, result);
    resultList.add(result);
}
//查詢角色組信息
if (CollectionUtils.isNotEmpty(roleGroupIds)) {
    List<RoleGroupInfo> roleGroupInfoList = roleGroupInfoMapper.selectByIds(new ArrayList<>(roleGroupIds));
    if (CollectionUtils.isNotEmpty(roleGroupInfoList)) {
        //將List轉換成Map,其中id主鍵作為key,對象作為value
        Map<Long, RoleGroupInfo> sourceMap = new HashMap<>();
        for (RoleGroupInfo roleGroupInfo : roleGroupInfoList) {
            sourceMap.put(roleGroupInfo.getId(), roleGroupInfo);
        }
        //封裝角色組名稱
        for (RoleInfoDto result : resultList) {
            if (sourceMap.containsKey(result.getRoleGroupId())) {
                result.setRoleGroupName(sourceMap.get(result.getRoleGroupId()).getName());
            }
        }
    }
}

3.1、集合轉 map(不分組)

在 jdk7 中,將集合中的元素轉 map,我們通常會采用如下方式。

/**
 * jdk7 將集合轉換成Map,其中用戶ID作為主鍵key
 * @param userList
 * @return
 */
public Map<Long, User> getMap(List<User> userList){
    Map<Long, User> userMap = new HashMap<>();
    for (User user : userList) {
        userMap.put(user.getUserId(), user);
    }
    return userMap;
}

在 jdk8 中,采用 stream api的方式,我們只需要一行代碼即可實現(xiàn)

/**
 * jdk8 將集合轉換成Map,其中用戶ID作為主鍵key,如果集合對象有重復的key,以第一個匹配到的為主
 * @param userList
 * @return
 */
public Map<Long, User> getMap(List<User> userList){
    Map<Long, User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, v -> v, (k1,k2) -> k1));
    return userMap;
}

打開Collectors.toMap方法源碼,一起來看看到底是啥。

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction) {
    return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}

從參數(shù)表可以看出:

  • 第一個參數(shù):表示 key
  • 第二個參數(shù):表示 value
  • 第三個參數(shù):表示某種規(guī)則

上文中的Collectors.toMap(User::getUserId, v -> v, (k1,k2) -> k1),表達的意思就是將userId的內容作為key,v -> v是表示將元素user作為value,其中(k1,k2) -> k1表示如果存在相同的key,將第一個匹配的元素作為內容,第二個舍棄!

3.2、集合轉map(分組)

在實際的操作中,有一些場景需要我們將相同的key,加入到一個集合,而不是覆蓋,哪改如何做呢?

如果是采用 jdk7,我們大概會這么做。

/**
 * jdk7 將集合轉換成Map,將相同的key,加入到一個集合中,實現(xiàn)分組
 * @param userList
 * @return
 */
public Map<Long, List<User>> getMapGroup(List<User> userList){
    Map<Long, List<User>> userListMap = new HashMap<>();
    for (User user : userList) {
        if(userListMap.containsKey(user.getUserId())){
            userListMap.get(user.getUserId()).add(user);
        } else {
            List<User> users = new ArrayList<>();
            users.add(user);
            userListMap.put(user.getUserId(), users);
        }
    }
    return userListMap;
}

而在 jdk8 中,采用 stream api的方式,我們只需要一行代碼即可實現(xiàn)

/**
 * jdk8 將集合轉換成Map,將相同的key,加入到一個集合中,實現(xiàn)分組
 * @param userList
 * @return
 */
public Map<Long, List<User>> getMapGroup(List<User> userList){
    Map<Long, List<User>> userMap = userList.stream().collect(Collectors.groupingBy(User::getUserId));
    return userMap;
}

四、分頁操作

stream api 的強大之處還不僅僅是對集合進行各種組合操作,還支持分頁操作。

例如,將如下的數(shù)組從小到大進行排序,排序完成之后,從第1行開始,查詢10條數(shù)據(jù)出來,操作如下:

//需要查詢的數(shù)據(jù)
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5,10, 6, 20, 30, 40, 50, 60, 100);
List<Integer> dataList= numbers.stream().sorted((x, y) -> x.compareTo(y)).skip(0).limit(10).collect(Collectors.toList());
System.out.println(dataList.toString());

其中skip參數(shù)表示第幾行,limit表示查詢的數(shù)量,類似頁容量!

五、查找與匹配操作

stream api 還支持對集合進行查找,同時還支持正則匹配模式。

  • allMatch(檢查是否匹配所有元素)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
boolean allMatch = list.stream()//
        .allMatch(x -> x > 2);//是否全部元素都大于2
System.out.println(allMatch);
  • findFirst(返回第一個元素)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
Optional<Integer> first = list.stream()//
        .findFirst();
Integer val = first.get();
System.out.println(val);//輸出10
  • reduce(可以將流中元素反復結合起來,得到一個值)
List<Integer> list = Arrays.asList(10, 5, 7, 3);
Integer result = list.stream()//
    .reduce(2, Integer::sum);
System.out.println(result);//輸出27,其實相當于2+10+5+7+3,就是一個累加

stream api 支持的操作方法非常多,這里只列舉了幾種類型,具體在使用的時候,可以參考官網(wǎng)接口文檔說明!

六、并行操作

所謂并行,指的是多個任務在同一時間點發(fā)生,并由不同的cpu進行處理,不互相搶占資源;而并發(fā),指的是多個任務在同一時間點內同時發(fā)生了,但由同一個cpu進行處理,互相搶占資源。

這點上大家一定要區(qū)分清楚,別弄混了!

stream api 的并行操作和串行操作,只有一個方法區(qū)別,其他都一樣,例如下面我們使用parallelStream來輸出空字符串的數(shù)量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 采用并行計算方法,獲取空字符串的數(shù)量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

在實際使用的時候,并行操作不一定比串行操作快!對于簡單操作,數(shù)量非常大,同時服務器是多核的話,建議使用Stream并行!反之,采用串行操作更可靠!

責任編輯:武曉燕 來源: 潘志的研發(fā)筆記
相關推薦

2021-04-15 07:32:02

java 代碼Stream

2021-09-27 10:03:55

裝飾器代碼

2021-07-12 07:08:54

責任鏈模式對象

2021-08-11 06:57:17

驗證碼圖片顯示

2024-07-29 09:13:42

2020-06-08 15:18:50

Python圖片PIL

2017-11-09 08:48:49

JavaScript編程黑科技

2017-12-07 15:05:50

全球互聯(lián)網(wǎng)創(chuàng)新峰會

2016-11-17 12:49:36

云運維銀行卡建設

2022-10-31 07:09:15

拷貝代碼項目

2025-02-17 08:50:00

CSS代碼JavaScript

2025-05-21 09:32:28

2019-12-25 14:19:21

Python編程語言Java

2020-09-29 14:13:29

寫一個高逼格可視化“圓

2024-12-05 08:13:18

2020-12-21 13:33:00

medit編輯器Linux

2023-11-23 16:46:55

LinuxAWK運維

2024-04-12 09:01:08

2024-02-26 18:11:08

Docker容器鏡像

2023-12-14 09:40:37

系統(tǒng)開源
點贊
收藏

51CTO技術棧公眾號

久草福利在线观看| 自拍另类欧美| 丰满人妻一区二区三区四区| 99精品电影| 精品人在线二区三区| 91免费视频网站在线观看| 婷婷在线视频观看| 成人激情动漫在线观看| 国产精品久久久久国产a级| 麻豆明星ai换脸视频| 精品一区二区男人吃奶| 欧美色偷偷大香| 国产精品一色哟哟| eeuss影院www在线播放| 国产激情一区二区三区桃花岛亚洲| 91精品国产91久久久久| 国产黄色录像片| 首页亚洲中字| 日韩视频国产视频| 在线观看免费黄网站| 伦理av在线| 国产精品久久久一本精品| 国产伦精品一区二区三毛| 中文字幕无线码一区| 影院欧美亚洲| 久久亚洲国产精品| 久久久久亚洲av成人无码电影| 免费观看性欧美大片无片| 色视频欧美一区二区三区| 香港三级日本三级a视频| av资源在线观看免费高清| 99这里只有久久精品视频| 亚洲自拍偷拍在线| 夜夜嗨aⅴ一区二区三区| 亚洲欧美久久| 性色av一区二区三区| 国产av无码专区亚洲av毛网站 | 国产精品18毛片一区二区| 亚洲精品无码久久久久| 久久九九电影| 欧美一级免费视频| 1级黄色大片儿| 亚洲天堂偷拍| 欧美精品免费看| 精品亚洲乱码一区二区 | 国产99久久久国产精品| 91精品国产综合久久男男| 正在播放亚洲精品| 青青草97国产精品免费观看| 国产精品88a∨| 国产成人麻豆免费观看| 久久不射2019中文字幕| 国内精品久久久久伊人av| 清纯粉嫩极品夜夜嗨av| 欧美一区二区三区久久精品茉莉花 | 一区二区高清在线| a级片一区二区| av在线看片| 一区二区三区日本| 国产精品69久久久| 老司机深夜福利在线观看| 精品女厕一区二区三区| 午夜免费福利小电影| 一个人www视频在线免费观看| 精品久久中文字幕| 超碰网在线观看| 成人黄色图片网站| 91精品综合久久久久久| 久久人妻少妇嫩草av蜜桃| 国产精品xxx在线观看| 亚洲国产高潮在线观看| 全黄一级裸体片| 日本a级不卡| 久久亚洲国产精品| 日韩精品乱码久久久久久| 久久精品网址| 成人a免费视频| 亚洲av无码一区二区乱子伦| 成人高清伦理免费影院在线观看| 极品校花啪啪激情久久| 国产精品一区在线看| 国产精品久久久久久久久动漫| 国产麻豆电影在线观看| 国产啊啊啊视频在线观看| 精品国产户外野外| 天天色综合社区| www.豆豆成人网.com| 日韩成人激情视频| 精品少妇一区二区三区密爱| 欧美日韩hd| 日韩美女视频中文字幕| 国产精品毛片一区视频播| 成人美女视频在线观看18| 欧洲精品久久| 国产福利视频在线观看| 欧美日韩国产一区二区| 欧美第一页浮力影院| 国产精品中文字幕制服诱惑| 亚洲午夜av久久乱码| 九九在线观看视频| 日韩电影一区二区三区四区| 91精品国产99久久久久久红楼 | 色综合影院在线| 久久精品国产亚洲AV无码麻豆| 久久午夜影视| **亚洲第一综合导航网站| 青草久久伊人| 一区二区高清在线| 最新天堂在线视频| 亚洲欧洲色图| 久久久久国产精品免费| 在线亚洲欧美日韩| 久久久亚洲高清| 91成人综合网| 伊人久久大香伊蕉在人线观看热v| 欧美精品一区二区不卡| 久艹在线观看视频| 七七婷婷婷婷精品国产| 精品国产一区二区三区四区vr| 米奇精品一区二区三区| 一本大道综合伊人精品热热| 原创真实夫妻啪啪av| 久久人体视频| 国产成人精品一区| 五月天婷婷在线观看| 一区二区三区国产精品| 日日干日日操日日射| 狠狠综合久久av一区二区蜜桃| 久久久久国产一区二区三区| 国产农村妇女毛片精品久久| 国产精品欧美久久久久无广告| 中文字幕日本最新乱码视频| 成人线上播放| 欧美激情综合亚洲一二区| 97国产精品久久久| 国产精品妹子av| 污污视频网站免费观看| 婷婷精品在线观看| 2019中文字幕在线| 天天操天天插天天射| 亚洲一区二区不卡免费| 韩国三级hd中文字幕有哪些| 888久久久| 91在线视频导航| 成人午夜在线影视| 欧美一级片在线观看| 免费中文字幕日韩| 精品影视av免费| 国产又黄又爽免费视频| 亚洲男人在线| 久久伊人精品一区二区三区| 91片黄在线观看喷潮| 最新高清无码专区| 一区二区三区国产好的精华液| 91精品精品| 91超碰在线免费观看| h片精品在线观看| 久久久精品视频在线| 麻豆影视在线播放| 亚洲熟妇一区二区三区| 伦伦影院午夜理论片| 亚洲青青久久| 久久精品国产亚洲一区二区| 怡红院男人的天堂| 中文字幕在线观看不卡| av中文字幕网址| 一区二区中文字| 国产成人精品日本亚洲11| 精品日韩av| 日韩成人性视频| 999视频在线| 国产精品福利电影一区二区三区四区| 三上悠亚在线一区| 亚洲香蕉网站| 日本不卡一二三区| 经典三级久久| 欧美亚洲另类在线| 69视频在线观看| 欧美不卡一区二区| 永久免费无码av网站在线观看| 亚洲国产精品成人久久综合一区| 国产成人美女视频| 亚洲大片在线| 亚洲欧美日产图| 成午夜精品一区二区三区软件| 欧美与欧洲交xxxx免费观看 | 日本免费成人| 欧美日韩成人在线视频| 性猛交xxxx| 宅男在线国产精品| 亚洲男人的天堂在线视频| 国产精品日日摸夜夜摸av| jjzz黄色片| 奇米色777欧美一区二区| 国产 国语对白 露脸| 国产在线日韩精品| 高清国产在线一区| jizz亚洲女人高潮大叫| 国内精品久久久久影院优 | 久久久久久成人精品| 国产免费av高清在线| 日韩精品在线看片z| 丰满人妻一区二区三区四区| 午夜欧美大尺度福利影院在线看| 国产无遮挡在线观看| 成人av网站在线观看免费| 超碰超碰在线观看| 国产欧美高清| 欧美一区二区视频在线播放| 色一区二区三区四区| 久久久久久久久久码影片| 高清在线一区二区| 国产99久久精品一区二区永久免费 | 日本a在线免费观看| 99久久亚洲精品蜜臀| 欧美综合激情| 精品欧美午夜寂寞影院| 91九色视频导航| 欧美日韩精品一区二区三区视频| 久久久久久久久久亚洲| sm国产在线调教视频| 少妇高潮久久久久久潘金莲| 精品视频三区| 日韩经典一区二区三区| 狠狠躁日日躁夜夜躁av| 欧美一区日韩一区| 亚洲专区第一页| 欧美性xxxxxx少妇| 精品不卡一区二区| 午夜视频在线观看一区二区| 国产精品九九九九九九| 中文字幕中文字幕一区| 久久日免费视频| 国产人久久人人人人爽| 国产精品密蕾丝袜| www日韩大片| 最新中文字幕视频| 97久久精品人人澡人人爽| 国产精品成人99一区无码| 国产成人午夜精品5599| 久久久久无码国产精品一区李宗瑞| 狠狠色狠狠色综合日日91app| www.亚洲高清| 男人的j进女人的j一区| 依人在线免费视频| 久久66热re国产| 亚洲午夜精品一区| 经典三级在线一区| 国内av免费观看| 国产高清一区日本| 亚洲图片综合网| 97国产精品videossex| 国产精品一级黄片| 91美女福利视频| 成人激情五月天| 国产精品久久三区| 国产suv精品一区二区68| 亚洲欧美经典视频| 久久人人爽人人爽人人| 亚洲成人综合视频| 亚洲自拍一区在线观看| 欧美在线视频全部完| 一本一道精品欧美中文字幕| 欧美日本在线看| 99久久精品国产一区色| 亚洲а∨天堂久久精品喷水| 亚洲av成人精品毛片| 亚洲天堂成人在线| 黄色一级片在线观看| 欧美丰满片xxx777| 亚洲黄色免费看| 成人av色在线观看| 视频一区中文字幕精品| 国产午夜精品一区| 成人vr资源| 日本黄网站色大片免费观看| 伊人成人在线视频| 九热视频在线观看| 国产成人精品亚洲日本在线桃色 | 日韩理论电影大全| 路边理发店露脸熟妇泻火| 亚洲经典三级| 玩弄japan白嫩少妇hd| 麻豆国产精品777777在线| 中文字幕一区二区三区人妻在线视频| 97精品久久久午夜一区二区三区| 国产综合精品久久久久成人av| 亚洲天堂2014| 中文字幕国产在线观看| 欧美一区欧美二区| 蝌蚪视频在线播放| 欧美乱妇高清无乱码| 欧美理论影院| 国产精华一区| 婷婷综合亚洲| 国产精品视频一区二区三区四区五区| 美女尤物国产一区| 性久久久久久久久久久| 日韩一区在线播放| 国产成人无码av| 日韩欧美高清一区| 成人p站proumb入口| 欧美日韩国产成人在线| www.26天天久久天堂| 久久久久国产精品视频| 欧美1级日本1级| www.日本xxxx| 99精品黄色片免费大全| 外国一级黄色片| 欧美性色综合网| 头脑特工队2在线播放| 另类天堂视频在线观看| 高清av一区二区三区| 国产在线精品一区二区三区》 | 99riav国产| 国产亚洲一区二区在线| h片精品在线观看| 99电影网电视剧在线观看| 欧美激情电影| 欧美黑人又粗又大又爽免费| 99国产精品久| 日韩成年人视频| 精品国产一区二区三区av性色| 色三级在线观看| 国产精品一区二区三区在线播放| 日本在线中文字幕一区| 亚洲色欲久久久综合网东京热| 国内精品国产成人| av最新在线观看| 欧美群妇大交群的观看方式| 国产一二三在线观看| 日本在线观看天堂男亚洲| 欧美自拍视频| www.浪潮av.com| 97超碰欧美中文字幕| 日韩精品一卡二卡| 精品国产免费人成电影在线观看四季 | x99av成人免费| 日韩经典一区| 视频一区视频二区视频| 日韩高清中文字幕一区| 欧美三级视频网站| 欧美日韩日本视频| 免费在线观看av片| 91丝袜美腿美女视频网站| 久久久久久久久国产一区| 成人av毛片在线观看| 《视频一区视频二区| 国产有码在线观看| 久久久91精品| 视频国产精品| 国内精品视频一区二区三区| 91在线国产福利| 好吊色在线视频| 在线观看欧美日韩| 91精品福利观看| 人人妻人人澡人人爽欧美一区| 国产盗摄一区二区三区| 国产91av视频| 亚洲视频精品在线| 欧美大陆国产| wwwwww欧美| 91香蕉视频mp4| 中文字幕在线日亚洲9| 日韩在线欧美在线| 日韩精品一区二区三区免费视频| 国产中文字幕乱人伦在线观看| 99久久er热在这里只有精品15| 国产中文字幕视频| 精品国产区一区二区三区在线观看| 精品国产亚洲一区二区在线观看| 国产 欧美 日韩 一区| 99v久久综合狠狠综合久久| 中文字幕日韩三级| 欧美二区乱c黑人| 九九视频精品全部免费播放| 蜜臀一区二区三区精品免费视频 | 久久先锋影音av鲁色资源网| 懂色av中文字幕| 欧美人与性动交| 国产成人调教视频在线观看| 中文字幕66页| 姬川优奈aav一区二区| 自拍视频在线网| 国产精品麻豆免费版| 日本中文字幕一区二区视频| 久草视频免费播放| 亚洲天堂色网站| 2020最新国产精品| 亚欧美在线观看| 亚洲va天堂va国产va久| 日韩欧美小视频| 精品欧美一区二区三区久久久| 老鸭窝一区二区久久精品| 国产成人免费观看视频 | 亚洲最大的黄色网址| 日韩精品视频在线观看网址| 亚洲久草在线| 日本中文字幕片| 亚洲一区在线观看网站|