java 两个集合比较_java 两个List集合各种情况对比处理

本文通过示例展示了Java中使用Lambda处理集合的几种常见操作,包括List去重、对象字段去重以及对比两个List的各种集合操作。利用Lambda和Stream API,可以高效地对集合进行处理和去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1. List去重:

/**

* java List Strasm去重

* @param args

*/

public static void main(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);

}

测试结果:

13c390844de049df6fce69b6382e122e.png

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

import java.util.ArrayList;

import java.util.List;

import java.util.stream.Collectors;

/**

*

测试user

* @version 1.0

* @author li_hao

* @date 2018年7月18日

*/

public class User {

private String userid;

private String username;

public User(String userid, String username) {

super();

this.userid = userid;

this.username = username;

}

public String getUserid() {

return userid;

}

public void setUserid(String userid) {

this.userid = userid;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

@Override

public String toString() {

return "User [userid=" + userid + ", username=" + username + "]";

}

/**

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

*/

public static void main(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中的集合:

import java.util.ArrayList;

import java.util.List;

import java.util.stream.Collectors;

public class TestStream {

/**

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

* @param list1 集合1

* @param list2 集合2

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

* @return List 返回处理后的集合

* 例如:

* 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, List list2, 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;

}

}

return retList;

}

/**

* 测试

*/

public static void main(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"));

}

}

测试结果:

41fe9e837bda486f762b4dbf1889f4a3.png

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

import java.util.ArrayList;

import java.util.List;

import java.util.stream.Collectors;

/**

*

测试user

* @version 1.0

* @author li_hao

* @date 2018年7月18日

*/

public class User {

private String userid;

private String username;

public User(String userid, String username) {

super();

this.userid = userid;

this.username = username;

}

public String getUserid() {

return userid;

}

public void setUserid(String userid) {

this.userid = userid;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

@Override

public String toString() {

return "User [userid=" + userid + ", username=" + username + "]";

}

/**

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

*/

public static void main(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);

}

}

测试结果:

3ae7628078876fff44206357b3cbc6b9.png

&lbrack;转&rsqb; Java程序员学C&num;基本语法两个小时搞定(对比学习)

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

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

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”04之 ConcurrentHashMap

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”05之 ConcurrentSkipListMap

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

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

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”02之 CopyOnWriteArrayList

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”03之 CopyOnWriteArraySet

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”07之 ArrayBlockingQueue

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

Java多线程系列--&OpenCurlyDoubleQuote;JUC集合”08之 LinkedBlockingQueue

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

随机推荐

微信应用号(小程序)开发IDE配置(第一篇)

2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...

jQuery判断及更改checkbox状态

判断:jquery对象.prop("checked") 选中:jquery对象.prop("checked", true) 取消选中:jquery对象.remo ...

Java关键字this、super使用总结

版权声明:原创作品,如需转载,请与作者联系.否则将追究法律责任. 作者:熔岩日期:2007-03-01MSN :leizhimin@126.com声明:原创作品,未经授权,谢绝转载! 好久没有对所学知 ...

MFC记住上次路径---遇到的一些问题

今天完成一个需求,就是记住用户选择的文件路径,先是熟悉代码,然后在网上找解决方法,一开始感觉没什么,网上的方法差不多,应该很容易做出来,结果真是卡了一半天,到晚上自己才慢慢的搞清楚了. 遇到的问题真不 ...

JDK1&period;5新特性&lpar;六&rpar;&hellip&semi;&hellip&semi;Generics

概述 Generics - This long-awaited enhancement to the type system allows a type or method to operate on ...

java制作简单的坦克大战

坦克大战是我们小时候玩红白机时代的经典游戏,看到有不少小伙伴都使用各种语言实现了一下,手痒痒,也使用java做的一个比较简单的坦克大战,主要面向于学过Java的人群,与学了一段时间的人,有利于面向对象 ...

JAX-WS创建和处理SOAP消息

JAX-WS规范是一组XML web services的JAVA API,在 JAX-WS中,一个远程调用可以转换为一个基于XML的协议例如SOAP,在使用JAX-WS过程中,开发者不需要编写任何生成 ...

makefile实例

#.PHONY:cleanall cleanobj cleandiff #cleanall:cleandiff cleanobj # rm program #cleanobj: # rm obj.c ...

selenium &plus; python 测试环境搭建 &lpar;WINDOWS&rpar;

1. 下载Python , 运行.exe -> http://python.org/getit/ 2. 下载Python Setuptools 基础包管理工具安装,官方文档参考 https:// ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值