Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在JAVA领域中发展较慢,直到java8,才开始支持Lambda。

抛开数学定义不看,直接来认识Lambda。Lambda表达式本质上是匿名方法,其底层还是通过invokedynamic指令来生成匿名类来实现。它提供了更为简单的语法和写作方式,允许你通过表达式来代替函数式接口。在一些人看来,Lambda就是可以让你的代码变得更简洁,完全可以不使用——这种看法当然没问题,但重要的是lambda为Java带来了闭包。得益于Lamdba对集合的支持,通过Lambda在多核处理器条件下对集合遍历时的性能提高极大,另外我们可以以数据流的方式处理集合——这是非常有吸引力的。

1. List去重:

  1. /**
  2. * java List Strasm去重
  3. * @param args
  4. */
  5. public static void main(String[] args) {
  6. List<String> list = new ArrayList<>();
  7. list.add("1");
  8. list.add("1");
  9. list.add("2");
  10. list.add("3");
  11. list.add("4");
  12. list.add("3");
  13. list.add("4");
  14. System.out.println("List去重前:" + list);
  15.  
  16. list = list.stream().distinct().collect(Collectors.toList());
  17. System.out.println("List去重后:" + list);
  18. }

测试结果:


2. List根据对象某个字段去重:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4.  
  5. /**
  6. * <p>测试user<p>
  7. * @version 1.0
  8. * @author li_hao
  9. * @date 2018年7月18日
  10. */
  11. public class User {
  12.  
  13. private String userid;
  14. private String username;
  15.  
  16. public User(String userid, String username) {
  17. super();
  18. this.userid = userid;
  19. this.username = username;
  20. }
  21.  
  22. public String getUserid() {
  23. return userid;
  24. }
  25. public void setUserid(String userid) {
  26. this.userid = userid;
  27. }
  28. public String getUsername() {
  29. return username;
  30. }
  31. public void setUsername(String username) {
  32. this.username = username;
  33. }
  34.  
  35. @Override
  36. public String toString() {
  37. return "User [userid=" + userid + ", username=" + username + "]";
  38. }
  39.  
  40. /**
  41. * list Stream根据对象userid字段去重
  42. */
  43. public static void main(String[] args) {
  44. List<User> list = new ArrayList<User>();
  45. list.add(new User("1","张三"));
  46. list.add(new User("1","zhangsan"));
  47. list.add(new User("2","李四"));
  48. list.add(new User("2","李四"));
  49. list.add(new User("3","刘大壮"));
  50.  
  51. System.out.println("根据userid去重前:" + list);
  52.  
  53. List<User> listRmdup = new ArrayList<User>();
  54. list.stream()
  55. .collect(Collectors.groupingBy(User :: getUserid)) //把list中数据根据userid分组
  56. .forEach((String userid, List<User> ls) -> { //遍历分组
  57. listRmdup.add(ls.get(0)); //取分组中的首个userid的对象存入新的listlistRmdup中
  58. });
  59.  
  60. // 分开写
  61. // Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(User :: getUserid)); //把list中数据根据userid分组
  62. // collect.forEach((String userid, List<User> ls) -> { //遍历分组
  63. // listRmdup.add(ls.get(0)); //取分组中的首个userid的对象存入新的listlistRmdup中
  64. // });
  65.  
  66. System.out.println("根据userid去重后:" + listRmdup);
  67. }
  68.  
  69. }

测试结果:

根据userid去重前:[User [userid=1, username=张三], User [userid=1, username=zhangsan], User [userid=2, username=李四], User [userid=2, username=李四], User [userid=3, username=刘大壮]]
根据userid去重后:[User [userid=1, username=张三], User [userid=2, username=李四], User [userid=3, username=刘大壮]]


3. 对比两个List,返回两个list中:合并后集合、合并去重后的集合、相同的集合、不同的集合、list1中不在list2中的集合、list2不在list1中的集合:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4.  
  5. public class TestStream {
  6.  
  7. /**
  8. * 对比两个list,返回两个list中:合并后集合、合并去重后的集合、相同的集合、不同的集合、list1中不在list2中的集合、list2不在list1中的集合
  9. * @param list1 集合1
  10. * @param list2 集合2
  11. * @param cmpType 比较类型返回:a:合并后集合;b:合并去重后的集合;c:相同的集合;d:不同的集合;e:list1中不在list2中的集合;f:list2不在list1中的集合;
  12. * @return List 返回处理后的集合
  13. * 例如:
  14. * list1 :[1, 2, 3, 3, 4, 5, 6]
  15. * list2 :[3, 4, 4, 7, 8]
  16. * a:合并后集合,listAll:[1, 2, 3, 3, 4, 5, 6, 3, 4, 4, 7, 8]
  17. * b:合并去重后的集合;[1, 2, 3, 4, 5, 6, 7, 8]
  18. * c:相同的集合;[3, 4]
  19. * d:不同的集合;[1, 2, 5, 6, 7, 8]
  20. * e:list1中不在list2中的集合;[1, 2, 5, 6]
  21. * f:list2不在list1中的集合;[7, 8]
  22. */
  23. public static List<String> compareList(List<String> list1, List<String> list2, String cmpType){
  24. List<String> retList = new ArrayList<String>();
  25. List<String> listAll = new ArrayList<String>();
  26.  
  27. listAll.addAll(list1);
  28. listAll.addAll(list2);
  29.  
  30. if("a".equals(cmpType)){
  31. //合并后的集合
  32. retList = listAll;
  33. }
  34. if("b".equals(cmpType)){
  35. //合并去重后的集合
  36. retList = listAll.stream().distinct().collect(Collectors.toList());
  37. }
  38. if("c".equals(cmpType) || "d".equals(cmpType) || "e".equals(cmpType) || "f".equals(cmpType)){
  39. //相同的集合
  40. List<String> listSameTemp = new ArrayList<String>();
  41. list1.stream().forEach(a -> {
  42. if(list2.contains(a))
  43. listSameTemp.add(a);
  44. });
  45. retList = listSameTemp.stream().distinct().collect(Collectors.toList());
  46.  
  47. //不同的集合
  48. if("d".equals(cmpType)){
  49. List<String> listTemp = new ArrayList<>(listAll);
  50. listTemp.removeAll(retList);
  51. retList = listTemp;
  52. }
  53. //list1中不在list2中的集合
  54. if("e".equals(cmpType)){
  55. List<String> listTemp = new ArrayList<>(list1);
  56. listTemp.removeAll(retList);
  57. retList = listTemp;
  58. }
  59. //list2中不在list1中的集合
  60. if("f".equals(cmpType)){
  61. List<String> listTemp = new ArrayList<>(list2);
  62. listTemp.removeAll(retList);
  63. retList = listTemp;
  64. }
  65. }
  66. return retList;
  67. }
  68.  
  69. /**
  70. * 测试
  71. */
  72. public static void main(String[] args) {
  73. List<String> list1 = new ArrayList<String>();
  74. list1.add(new String("1"));
  75. list1.add(new String("2"));
  76. list1.add(new String("3"));
  77. list1.add(new String("3"));
  78. list1.add(new String("4"));
  79. list1.add(new String("5"));
  80. list1.add(new String("6"));
  81.  
  82. List<String> list2 = new ArrayList<String>();
  83. list2.add(new String("3"));
  84. list2.add(new String("4"));
  85. list2.add(new String("4"));
  86. list2.add(new String("7"));
  87. list2.add(new String("8"));
  88.  
  89. System.out.println("list1:" + list1);
  90. System.out.println("list2:" + list2);
  91. System.out.println("合并后集合:" + compareList(list1, list2, "a"));
  92. System.out.println("合并去重后的集合:" + compareList(list1, list2, "b"));
  93. System.out.println("相同的集合:" + compareList(list1, list2, "c"));
  94. System.out.println("不同的集合:" + compareList(list1, list2, "d"));
  95. System.out.println("list1中不在list2中的集合:" + compareList(list1, list2, "e"));
  96. System.out.println("list2中不在list1中的集合:" + compareList(list1, list2, "f"));
  97.  
  98. }
  99. }

测试结果:


 4. 从一个对象集合中获取每个对象的某个值返回一个新的集合:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4.  
  5. /**
  6. * <p>测试user<p>
  7. * @version 1.0
  8. * @author li_hao
  9. * @date 2018年7月18日
  10. */
  11. public class User {
  12.  
  13. private String userid;
  14. private String username;
  15.  
  16. public User(String userid, String username) {
  17. super();
  18. this.userid = userid;
  19. this.username = username;
  20. }
  21.  
  22. public String getUserid() {
  23. return userid;
  24. }
  25. public void setUserid(String userid) {
  26. this.userid = userid;
  27. }
  28. public String getUsername() {
  29. return username;
  30. }
  31. public void setUsername(String username) {
  32. this.username = username;
  33. }
  34.  
  35. @Override
  36. public String toString() {
  37. return "User [userid=" + userid + ", username=" + username + "]";
  38. }
  39.  
  40. /**
  41. * 从一个对象集合中获取每个对象的某个值返回一个新的集合
  42. */
  43. public static void main(String[] args) {
  44. List<User> list = new ArrayList<User>();
  45. list.add(new User("1","张三"));
  46. list.add(new User("2","李四"));
  47. list.add(new User("3","刘大壮"));
  48.  
  49. System.out.println("处理前:" + list);
  50.  
  51. List<String> Useridlist = list.stream().map(User :: getUserid).collect(Collectors.toList());
  52.  
  53. System.out.println("处理后:" + Useridlist);
  54. }
  55.  
  56. }

测试结果:

java 两个List集合各种情况对比处理的更多相关文章

  1. [转] Java程序员学C#基本语法两个小时搞定(对比学习)

    Java程序员学C#基本语法两个小时搞定(对比学习)   对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. ...

  2. 【java】【反射】反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更

    java的反射实现: 判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码: package com.sxd.streamTest; imp ...

  3. Java多线程系列--“JUC集合”04之 ConcurrentHashMap

    概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...

  4. Java多线程系列--“JUC集合”05之 ConcurrentSkipListMap

    概要 本章对Java.util.concurrent包中的ConcurrentSkipListMap类进行详细的介绍.内容包括:ConcurrentSkipListMap介绍ConcurrentSki ...

  5. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  6. Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

    概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...

  7. Java多线程系列--“JUC集合”03之 CopyOnWriteArraySet

    概要 本章是JUC系列中的CopyOnWriteArraySet篇.接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解 ...

  8. Java多线程系列--“JUC集合”07之 ArrayBlockingQueue

    概要 本章对Java.util.concurrent包中的ArrayBlockingQueue类进行详细的介绍.内容包括:ArrayBlockingQueue介绍ArrayBlockingQueue原 ...

  9. Java多线程系列--“JUC集合”08之 LinkedBlockingQueue

    概要 本章介绍JUC包中的LinkedBlockingQueue.内容包括:LinkedBlockingQueue介绍LinkedBlockingQueue原理和数据结构LinkedBlockingQ ...

随机推荐

  1. 防止shell script多次运行

    一个思路是在script初期检测系统中是否存在同名进程. ] then echo "This script is already running. Exit." else whil ...

  2. git切换远程仓库地址

    $ git remote  -vorigin  http://192.168.1.100/aaa/Project.git (fetch)origin  http://192.168.1.100/aaa ...

  3. Linux系统编程——Daemon进程

    目录 Daemon进程介绍 前提知识 Daemon进程的编程规则 Daemon进程介绍 Daemon运行在后台也称作"后台服务进程". 它是没有控制终端与之相连的进程.它独立与控制 ...

  4. 3、谈谈 Java NIO

    在 JDK1.4 之后,为了提高 Java IO 的效率,Java 提供了一套 New IO (NIO),之所以称之为 New,原因在于它相对于之前的 IO 类库是新增的.此外,旧的 IO 类库提供的 ...

  5. 记录7: office 2016 Mac不能使用的解决过程

    前几天更新硬盘并升级到high sierra后,今天第一次打开word/excel发现用不了,提示让我进行active.很奇怪,之前的license应该是一直有效的.于是去www.office.com ...

  6. Pandas学习笔记(三)

    (1)系列对象( Series)基本功能 编号 属性或方法 描述 1 axes 返回行轴标签列表. 2 dtype 返回对象的数据类型(dtype). 3 empty 如果系列为空,则返回True. ...

  7. 团队第四次 # scrum meeting

    github 本此会议项目由PM召开,召开时间为4-8日晚上10点 召开时长15分钟 任务表格 袁勤 负责编写登陆逻辑 https://github.com/buaa-2016/phyweb/issu ...

  8. python数据类型、if判断语句

    python的数据类型: int(整型) float(浮点型) #相较c++,去除了char.long.longlong... str(字符串)    #同等c++ sting类型 list(列表) ...

  9. Oracle监听已经启动了 sqlplus / as sysdba 仍然报 ERROR:ORA-12560

    我的Oracle是11g的 system 的密码忘记了, 但是scott的密码我还记得而且能登录 . 想以sqlplus /as sysdba 修改system密码 一直在报 ERROR:ORA-12 ...

  10. CUDA编程模型——组织并行线程2 (1D grid 1D block)

    在”组织并行编程1“中,通过组织并行线程为”2D grid 2D block“对矩阵求和,在本文中通过组织为 1D grid 1D block进行矩阵求和.一维网格和一维线程块的结构如下图: 其中,n ...