java求两集合中没有的值_java 两个List集合各种情况对比处理

本文介绍了Java中利用Lambda表达式处理集合的一些常见操作,包括List去重、根据对象字段去重、对比两个List并获取各种组合结果以及从对象集合中提取特定字段生成新集合。示例代码详细展示了如何使用Java 8的Stream API来实现这些功能。

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

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

1. List去重:

/*** java List Strasm去重

*@paramargs*/

public static voidmain(String[] args) {

List list = new ArrayList<>();

list.add("1");

list.add("1");

list.add("2");

list.add("3");

list.add("4");

list.add("3");

list.add("4");

System.out.println("List去重前:" +list);

list=list.stream().distinct().collect(Collectors.toList());

System.out.println("List去重后:" +list);

}

测试结果:

94a30b3abd9679a62aca2662409bc73b.png

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

importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;/***

测试user

*@version1.0

*@authorli_hao

* @date 2018年7月18日*/

public classUser {privateString userid;privateString username;publicUser(String userid, String username) {super();this.userid =userid;this.username =username;

}publicString getUserid() {returnuserid;

}public voidsetUserid(String userid) {this.userid =userid;

}publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}

@OverridepublicString toString() {return "User [userid=" + userid + ", username=" + username + "]";

}/*** list Stream根据对象userid字段去重*/

public static voidmain(String[] args) {

List list = new ArrayList();

list.add(new User("1","张三"));

list.add(new User("1","zhangsan"));

list.add(new User("2","李四"));

list.add(new User("2","李四"));

list.add(new User("3","刘大壮"));

System.out.println("根据userid去重前:" +list);

List listRmdup = new ArrayList();

list.stream()

.collect(Collectors.groupingBy(User :: getUserid))//把list中数据根据userid分组

.forEach((String userid, List ls) -> { //遍历分组

listRmdup.add(ls.get(0)); //取分组中的首个userid的对象存入新的listlistRmdup中

});//分开写//Map> collect = list.stream().collect(Collectors.groupingBy(User :: getUserid));//把list中数据根据userid分组//collect.forEach((String userid, List ls) -> {//遍历分组//listRmdup.add(ls.get(0));//取分组中的首个userid的对象存入新的listlistRmdup中//});

System.out.println("根据userid去重后:" +listRmdup);

}

}

测试结果:

根据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中的集合:

importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;public classTestStream {/*** 对比两个list,返回两个list中:合并后集合、合并去重后的集合、相同的集合、不同的集合、list1中不在list2中的集合、list2不在list1中的集合

*@paramlist1 集合1

*@paramlist2 集合2

*@paramcmpType 比较类型返回:a:合并后集合;b:合并去重后的集合;c:相同的集合;d:不同的集合;e:list1中不在list2中的集合;f:list2不在list1中的集合;

*@returnList 返回处理后的集合

* 例如:

* list1 :[1, 2, 3, 3, 4, 5, 6]

* list2 :[3, 4, 4, 7, 8]

* a:合并后集合,listAll:[1, 2, 3, 3, 4, 5, 6, 3, 4, 4, 7, 8]

* b:合并去重后的集合;[1, 2, 3, 4, 5, 6, 7, 8]

* c:相同的集合;[3, 4]

* d:不同的集合;[1, 2, 5, 6, 7, 8]

* e:list1中不在list2中的集合;[1, 2, 5, 6]

* f:list2不在list1中的集合;[7, 8]*/

public static List compareList(List list1, Listlist2, String cmpType){

List retList = new ArrayList();

List listAll = new ArrayList();

listAll.addAll(list1);

listAll.addAll(list2);if("a".equals(cmpType)){//合并后的集合

retList =listAll;

}if("b".equals(cmpType)){//合并去重后的集合

retList =listAll.stream().distinct().collect(Collectors.toList());

}if("c".equals(cmpType) || "d".equals(cmpType) || "e".equals(cmpType) || "f".equals(cmpType)){//相同的集合

List listSameTemp = new ArrayList();

list1.stream().forEach(a->{if(list2.contains(a))

listSameTemp.add(a);

});

retList=listSameTemp.stream().distinct().collect(Collectors.toList());//不同的集合

if("d".equals(cmpType)){

List listTemp = new ArrayList<>(listAll);

listTemp.removeAll(retList);

retList=listTemp;

}//list1中不在list2中的集合

if("e".equals(cmpType)){

List listTemp = new ArrayList<>(list1);

listTemp.removeAll(retList);

retList=listTemp;

}//list2中不在list1中的集合

if("f".equals(cmpType)){

List listTemp = new ArrayList<>(list2);

listTemp.removeAll(retList);

retList=listTemp;

}

}returnretList;

}/*** 测试*/

public static voidmain(String[] args) {

List list1 = new ArrayList();

list1.add(new String("1"));

list1.add(new String("2"));

list1.add(new String("3"));

list1.add(new String("3"));

list1.add(new String("4"));

list1.add(new String("5"));

list1.add(new String("6"));

List list2 = new ArrayList();

list2.add(new String("3"));

list2.add(new String("4"));

list2.add(new String("4"));

list2.add(new String("7"));

list2.add(new String("8"));

System.out.println("list1:" +list1);

System.out.println("list2:" +list2);

System.out.println("合并后集合:" + compareList(list1, list2, "a"));

System.out.println("合并去重后的集合:" + compareList(list1, list2, "b"));

System.out.println("相同的集合:" + compareList(list1, list2, "c"));

System.out.println("不同的集合:" + compareList(list1, list2, "d"));

System.out.println("list1中不在list2中的集合:" + compareList(list1, list2, "e"));

System.out.println("list2中不在list1中的集合:" + compareList(list1, list2, "f"));

}

}

测试结果:

b8d0d57e4f6b5e4bbbdd52c9a1bfc250.png

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

importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;/***

测试user

*@version1.0

*@authorli_hao

* @date 2018年7月18日*/

public classUser {privateString userid;privateString username;publicUser(String userid, String username) {super();this.userid =userid;this.username =username;

}publicString getUserid() {returnuserid;

}public voidsetUserid(String userid) {this.userid =userid;

}publicString getUsername() {returnusername;

}public voidsetUsername(String username) {this.username =username;

}

@OverridepublicString toString() {return "User [userid=" + userid + ", username=" + username + "]";

}/*** 从一个对象集合中获取每个对象的某个值返回一个新的集合*/

public static voidmain(String[] args) {

List list = new ArrayList();

list.add(new User("1","张三"));

list.add(new User("2","李四"));

list.add(new User("3","刘大壮"));

System.out.println("处理前:" +list);

List Useridlist =list.stream().map(User :: getUserid).collect(Collectors.toList());

System.out.println("处理后:" +Useridlist);

}

}

测试结果:

a79cc5d4253fa39ec47464e1a26951ae.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值