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

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

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

[[393227]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。  

一、介紹

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

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

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

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

操作流程如下:

  1. +--------------------+       +------+   +------+   +---+   +-------+ 
  2. | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| 
  3. +--------------------+       +------+   +------+   +---+   +-------+ 

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

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

二、遍歷操作

2.1、遍歷集合

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

  1. /** 
  2.  * jdk7 從集合對象中獲取用戶ID集合 
  3.  * @param userList 
  4.  * @return 
  5.  */ 
  6. public List<Long> getUserIds(List<User> userList){ 
  7.     List<Long> userIds = new ArrayList<>(); 
  8.     for (User user : userList) { 
  9.         userIds.add(user.getUserId()); 
  10.     } 
  11.     return userIds; 

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

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

2.2、篩選元素

篩選元素,是日常開發中經常會碰到,例如在 jdk7,我們會這么操作:

  1. /** 
  2.  * jdk7 從集合對象中過濾出用戶ID不為空的數據 
  3.  * @param userList 
  4.  * @return 
  5.  */ 
  6. public List<Long> getUserIds7(List<User> userList){ 
  7.     List<Long> userIds = new ArrayList<>(); 
  8.     for (User user : userList) { 
  9.         if(user.getUserId() != null){ 
  10.             userIds.add(user.getUserId()); 
  11.         } 
  12.     } 
  13.     return userIds; 

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

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

2.3、刪除重復的內容

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

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

2.4、數據類型轉換

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

  1. /** 
  2.  * jdk8 將Long類型數據轉換成String類型 
  3.  * @param userIds 
  4.  * @return 
  5.  */ 
  6. public List<String> getUserIds10(List<Long> userIds){ 
  7.     List<String> userIdStrs = userIds.stream().map(x -> x.toString()).collect(Collectors.toList()); 
  8.     return userIdStrs; 

2.5、數組轉集合

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

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

三、集合轉Map操作

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

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

實際代碼案例分享

  1. //角色組ID集合 
  2. Set<Long> roleGroupIds = new HashSet<>(); 
  3. //查詢所有的角色信息 
  4. List<RoleInfo> dbList = roleInfoMapper.findByPage(request); 
  5. for (RoleInfo source : dbList) { 
  6.     roleGroupIds.add(source.getRoleGroupId()); 
  7.     RoleInfoDto result = new RoleInfoDto(); 
  8.     BeanUtils.copyProperties(source, result); 
  9.     resultList.add(result); 
  10. //查詢角色組信息 
  11. if (CollectionUtils.isNotEmpty(roleGroupIds)) { 
  12.     List<RoleGroupInfo> roleGroupInfoList = roleGroupInfoMapper.selectByIds(new ArrayList<>(roleGroupIds)); 
  13.     if (CollectionUtils.isNotEmpty(roleGroupInfoList)) { 
  14.      //將List轉換成Map,其中id主鍵作為key,對象作為value 
  15.         Map<Long, RoleGroupInfo> sourceMap = new HashMap<>(); 
  16.         for (RoleGroupInfo roleGroupInfo : roleGroupInfoList) { 
  17.             sourceMap.put(roleGroupInfo.getId(), roleGroupInfo); 
  18.         } 
  19.   //封裝角色組名稱 
  20.         for (RoleInfoDto result : resultList) { 
  21.             if (sourceMap.containsKey(result.getRoleGroupId())) { 
  22.                 result.setRoleGroupName(sourceMap.get(result.getRoleGroupId()).getName()); 
  23.             } 
  24.         } 
  25.     } 

3.1、集合轉 map(不分組)

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

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

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

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

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

  1. public static <T, K, U> 
  2. Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper, 
  3.                                 Function<? super T, ? extends U> valueMapper, 
  4.                                 BinaryOperator<U> mergeFunction) { 
  5.     return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); 

從參數表可以看出:

  • 第一個參數:表示 key
  • 第二個參數:表示 value
  • 第三個參數:表示某種規則

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

3.2、集合轉map(分組)

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

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

  1. /** 
  2.  * jdk7 將集合轉換成Map,將相同的key,加入到一個集合中,實現分組 
  3.  * @param userList 
  4.  * @return 
  5.  */ 
  6. public Map<Long, List<User>> getMapGroup(List<User> userList){ 
  7.     Map<Long, List<User>> userListMap = new HashMap<>(); 
  8.     for (User user : userList) { 
  9.         if(userListMap.containsKey(user.getUserId())){ 
  10.             userListMap.get(user.getUserId()).add(user); 
  11.         } else { 
  12.             List<User> users = new ArrayList<>(); 
  13.             users.add(user); 
  14.             userListMap.put(user.getUserId(), users); 
  15.         } 
  16.     } 
  17.     return userListMap; 

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

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

四、分頁操作

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

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

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

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

五、查找與匹配操作

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

  • allMatch(檢查是否匹配所有元素)
  1. List<Integer> list = Arrays.asList(10, 5, 7, 3); 
  2. boolean allMatch = list.stream()// 
  3.         .allMatch(x -> x > 2);//是否全部元素都大于2 
  4. System.out.println(allMatch); 
  • findFirst(返回第一個元素)
  1. List<Integer> list = Arrays.asList(10, 5, 7, 3); 
  2. Optional<Integerfirst = list.stream()// 
  3.         .findFirst(); 
  4. Integer val = first.get(); 
  5. System.out.println(val);//輸出10 

reduce(可以將流中元素反復結合起來,得到一個值)

  1. List<Integer> list = Arrays.asList(10, 5, 7, 3); 
  2. Integer result = list.stream()// 
  3.     .reduce(2, Integer::sum); 
  4. System.out.println(result);//輸出27,其實相當于2+10+5+7+3,就是一個累加 

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

六、并行操作

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

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

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

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

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

七、小結

本文主要,圍繞 jdk stream api 操作,結合實際的日常開發需求,做了簡單總結和分享,鑒于筆者才疏學淺,可能也有理解不到位的地方,歡迎網友們批評指出!

 

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2024-12-02 10:15:15

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

全球互聯網創新峰會

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

系統開源
點贊
收藏

51CTO技術棧公眾號

精品孕妇一区二区三区| 妺妺窝人体色www在线下载| 另类图片综合电影| 久久久综合网站| 国产精品入口日韩视频大尺度| 欧美大波大乳巨大乳| 日韩av一级| 亚洲日本护士毛茸茸| 99电影网电视剧在线观看| 国产精品30p| 国产日产精品一区二区三区四区的观看方式| 欧美性xxxx在线播放| 日韩尤物视频| 精品国产av一区二区| 樱桃成人精品视频在线播放| 亚洲精品自产拍| 自拍偷拍一区二区三区四区| 中文字幕资源网在线观看| av高清久久久| 国产免费观看久久黄| 中文字幕另类日韩欧美亚洲嫩草| 成人性生交大片免费看96| 欧美性极品少妇精品网站| 亚洲第一综合| 三级小视频在线观看| 日本欧美久久久久免费播放网| 蜜臀久久99精品久久久无需会员 | 亚洲欧美日韩高清在线| 亚洲精品乱码久久久久久按摩观| 国产精品一区二区小说| av剧情在线观看| 国产精品欧美极品| 极品校花啪啪激情久久| 国产伦子伦对白视频| 免费国产自线拍一欧美视频| 久久久av亚洲男天堂| 加勒比一区二区| 99久热这里只有精品视频免费观看| 在线视频亚洲一区| 欧美成人高潮一二区在线看| 91免费在线| 91视频精品在这里| ts人妖另类在线| 一级黄色片在线观看| 西西人体一区二区| 久久久免费在线观看| 欧美一级特黄高清视频| 国产欧美久久一区二区三区| 精品国产凹凸成av人导航| 成人日韩在线视频| 99欧美精品| 一本色道久久综合精品竹菊| 一本色道久久88亚洲精品综合| p色视频免费在线观看| 2020国产精品自拍| 久久久久久久久久久久久久一区| 国产黄色美女视频| 激情av综合网| 国产美女91呻吟求| 中文字幕人妻一区二区三区视频 | 国产天堂在线播放| 小h片在线观看| 亚洲成av人片www| 欧美国产综合在线| 在线网址91| 亚洲欧美国产高清| av磁力番号网| av在线播放国产| 1区2区3区精品视频| 亚洲国产精品日韩| 日本三级视频在线播放| 国产精品国模大尺度视频| 亚洲精品一区二区三区四区五区| 韩国精品视频| 国产欧美中文在线| 午夜精品一区二区三区四区| 国产三级在线| 国产精品入口麻豆原神| 一区二区成人国产精品| 在线中文资源天堂| 亚洲三级在线播放| 久久久久久久久影视| 日韩欧美一起| 亚洲成在线观看| 久久久久久久久久久视频| 国产一二在线播放| 欧美日韩在线第一页| 国产视频一区二区三区在线播放| 日韩三区免费| 欧美人动与zoxxxx乱| 日韩成人精品视频在线观看| 精品国模一区二区三区欧美| 日韩欧美在线网站| 黄色免费视频网站| 一本久久青青| 色婷婷久久av| 欧美日韩免费一区二区| 亚洲黄色大片| 日本亚洲欧美成人| 亚洲怡红院av| 国产精品 欧美精品| 91精品久久久久| 午夜精品无码一区二区三区| av在线综合网| 精品视频免费观看| 在线观看av的网站| 亚洲激情在线播放| 99999精品视频| 91p九色成人| 欧美一区二区免费| 成人在线观看一区二区| 精品女人视频| 这里只有精品在线观看| 国产一级淫片a| 久久99热国产| 国产欧美丝袜| 国产精品久久麻豆| 精品久久久一区| www.99r| 成人另类视频| 久久精品国产91精品亚洲| 国产无码精品视频| 国产自产v一区二区三区c| 久久亚洲综合网| 狂野欧美激情性xxxx欧美| 91黄视频在线| 日韩成人av影院| 欧美黄色大片在线观看| 38少妇精品导航| www.成人在线观看| 国产精品免费aⅴ片在线观看| 999在线观看视频| a屁视频一区二区三区四区| 精品国产百合女同互慰| 成人在线观看高清| 日韩精品成人一区二区三区| 国产精品免费一区二区三区在线观看| 岛国在线大片| 午夜精品在线视频一区| 亚洲欧美一区二区三区不卡| 精品美女久久久| 欧美亚洲国产成人精品| 国模人体一区二区| 亚洲欧美成人一区二区三区| www.激情小说.com| 国产精品一区二区av交换| 国外成人免费在线播放 | 日韩欧美自拍偷拍| 男女做暖暖视频| 免费看欧美美女黄的网站| 鲁鲁视频www一区二区| free性护士videos欧美| 日韩欧美www| 国产三级国产精品国产国在线观看| 日韩精品一级二级 | 日韩精品免费一区二区在线观看| 91av在线看| 五月天婷婷激情网| 午夜精品久久久久久久久久久| 在线观看网站黄| 性欧美欧美巨大69| 国产在线播放不卡| 日本中文字幕在线播放| 欧美视频一区二区| 天天操天天干天天操天天干| 欧美在线综合| 免费影院在线观看一区| 爱情岛亚洲播放路线| 欧美成人a∨高清免费观看| 成人免费毛片东京热| 国内精品免费**视频| 日韩中文字幕亚洲精品欧美| 天堂久久av| 欧美国产日韩一区二区三区| 亚洲精品久久久蜜桃动漫| 亚洲一二三四区| 国产伦精品一区二区免费| 国产视频一区欧美| 欧美成ee人免费视频| 欧美大片免费观看网址| 中文字幕精品在线| 艳妇乳肉豪妇荡乳av| 亚洲女同ⅹxx女同tv| www.欧美com| 国产欧美69| 日韩欧美视频一区二区三区四区 | 91久久中文| 久久精品中文字幕一区二区三区| 国模冰冰炮一区二区| 色婷婷久久av| 欧美熟妇交换久久久久久分类 | 成人精品鲁一区一区二区| 日本日本19xxxⅹhd乱影响| 国产伦精品一区二区三区视频 | 亚洲成av人片在线观看香蕉| 日本熟女毛茸茸| 国产精品乱码人人做人人爱| 久久艹这里只有精品| 国产日韩欧美一区在线| 亚洲一区二区精品在线| 一区二区网站| 国产高清在线不卡| 日韩精品亚洲人成在线观看| 日韩精品在线观| 夜夜爽8888| 午夜av一区二区| 精品人体无码一区二区三区| 国产不卡视频一区| 国产无套粉嫩白浆内谢的出处| 一本精品一区二区三区| 激情久久av| 日本黄色成人| 青青久久av北条麻妃海外网| www在线视频| 在线观看视频99| 色屁屁草草影院ccyycom| 欧美日韩高清一区二区| 伊人久久综合视频| 亚洲色欲色欲www| 中国黄色a级片| 国产精品夜夜嗨| 欧美伦理片在线观看| 中文在线日韩| 天天人人精品| 日本妇女一区| 91久久精品国产91久久性色| 免费一二一二在线视频| 久久伊人91精品综合网站| 免费在线黄色网址| 亚洲福利影片在线| 97国产精品久久久| 一本久久精品一区二区| 国产精品9191| 亚洲男人都懂的| 亚洲国产精品一区二区久久hs| 91亚洲精华国产精华精华液| 欧美日韩一区二区区| 蜜桃av噜噜一区二区三区小说| 国产视频一视频二| 欧美日韩成人| 天天成人综合网| 日韩av二区| 免费在线成人av电影| 国产suv精品一区| 亚洲伊人成综合成人网| 高清欧美日韩| 国产精品户外野外| 亚洲天堂资源| 日产精品久久久一区二区福利| 国产在线xxx| 欧美精品videossex88| 菠萝蜜视频国产在线播放| 日韩在线视频观看| 在线观看国产原创自拍视频| 亚洲性视频网站| 日本福利片高清在线观看| 精品一区二区三区三区| 亚洲欧美综合在线观看| 亚洲精品国产品国语在线| 国产成人自拍一区| 亚洲第一精品福利| 人妻一区二区三区四区| 亚洲精品短视频| 天堂资源中文在线| 亚洲精品网站在线播放gif| 日本中文字幕一区二区有码在线| 亚洲国产精品福利| 秋霞av在线| 亚洲视频一区二区三区| 国产高清视频在线| 在线精品高清中文字幕| 天天在线视频色| 久久影视免费观看| 久久电影网站| 97久久久久久| 欧美片第一页| 国产美女91呻吟求| 日本高清久久| 精品久久久久久乱码天堂| 先锋影音国产精品| 午夜精品福利一区二区| 亚洲人metart人体| 久久99久久99精品| 久久亚洲国产精品一区二区| 欧美一级特黄a| 国产美女主播视频一区| 中文字幕第九页| 国产人成一区二区三区影院| 国产精品视频看看| 一区二区三区资源| 国产精品男女视频| 欧美日韩精品欧美日韩精品 | free性欧美hd另类精品| 欧美极品少妇xxxxⅹ免费视频| 小视频免费在线观看| 国产日韩欧美视频| 岛国成人av| 久久99热只有频精品91密拍| 激情五月色综合国产精品| 日本一区高清在线视频| 一本一本久久a久久综合精品| 亚洲熟妇av日韩熟妇在线| 亚洲最黄网站| 久久久久久久久久一区二区| 国产高清精品网站| 中国极品少妇videossexhd | 国产在线播放不卡| 久久香蕉精品香蕉| 一区二区三区我不卡| 亚洲黄网站黄| 五月婷婷之婷婷| 99精品视频在线免费观看| 成人午夜免费影院| 亚洲福利电影网| 亚洲综合精品视频| 亚洲精品资源美女情侣酒店| av片在线观看网站| 国产成人精品免费久久久久| 亚洲一区二区免费在线观看| 日本免费高清一区| 黑人一区二区| 久久久久久久高清| 国产丝袜欧美中文另类| 国产无遮挡又黄又爽又色| 欧美日韩精品是欧美日韩精品| 飘雪影院手机免费高清版在线观看| 久久精品久久久久久| 丝袜美腿诱惑一区二区三区| 懂色中文一区二区三区在线视频| 亚洲aaa级| 一卡二卡三卡视频| 狠狠色2019综合网| 天天干天天舔天天操| 舔着乳尖日韩一区| 成人福利小视频| x99av成人免费| 天天免费亚洲黑人免费| 精品国产乱码久久久久久蜜柚| 综合激情婷婷| 亚洲欧美天堂在线| 国产情人综合久久777777| 99热国产在线观看| 亚洲国产成人av在线| 18av在线播放| 91成人理论电影| 99久久夜色精品国产亚洲1000部| 国产成人久久婷婷精品流白浆| 成人av在线影院| 国产真实夫妇交换视频| 欧美一区二区美女| www久久日com| 亚洲free嫩bbb| 99久久婷婷这里只有精品 | 精品av在线播放| 国产欧美日韩成人| 精品国产一区二区三区久久狼黑人| 欧美久久久网站| 亚洲电影一二三区| 久久99精品久久久| 麻豆天美蜜桃91| 日韩欧美电影一二三| av在线理伦电影| 精品久久久久久综合日本| 亚洲人成毛片在线播放女女| 扒开伸进免费视频| 天天色 色综合| 亚洲av电影一区| 浅井舞香一区二区| 国产成人一区| 美女一区二区三区视频| 亚洲国产电影在线观看| 亚洲一区二区色| 欧美成人一区在线| eeuss国产一区二区三区四区| 日韩激情视频一区二区| 99国产精品久久久久| 4438国产精品一区二区| 中文字幕国产亚洲2019| 国产精区一区二区| 亚洲国产精品无码观看久久| 91蜜桃免费观看视频| 艳妇乳肉豪妇荡乳av无码福利| 中文字幕av日韩| av日韩精品| 国产av天堂无码一区二区三区| 99视频热这里只有精品免费| 无码人妻丰满熟妇区五十路| 亚洲欧美日韩在线高清直播| 三级中文字幕在线观看| 欧美一区少妇| 狠狠色狠狠色合久久伊人| 久久精品视频日本| 亚洲男女性事视频| 九九九精品视频| 久久成人福利视频| 国产人妖乱国产精品人妖| 99久久免费国产精精品| 欧美亚洲国产日本| 99久久婷婷国产综合精品电影√| 在线天堂www在线国语对白|