java 两个List集合各种情况对比处理 - 漂流的老妖怪

时间:2024-04-15 08:29:00

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<String> 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);
    }

测试结果:


 

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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>测试user<p>
 * @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<User> list = new ArrayList<User>();
        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<User> listRmdup = new ArrayList<User>();
        list.stream()
            .collect(Collectors.groupingBy(User :: getUserid))  //把list中数据根据userid分组
            .forEach((String userid, List<User> ls) -> {  //遍历分组
                listRmdup.add(ls.get(0));  //取分组中的首个userid的对象存入新的listlistRmdup中
            });
        
//        分开写
//        Map<String, List<User>> collect = list.stream().collect(Collectors.groupingBy(User :: getUserid));  //把list中数据根据userid分组
//        collect.forEach((String userid, List<User> 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<String> compareList(List<String> list1, List<String> list2, String cmpType){
        List<String> retList = new ArrayList<String>();
        List<String> listAll = new ArrayList<String>();
        
        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<String> listSameTemp = new ArrayList<String>();
            list1.stream().forEach(a -> {
                if(list2.contains(a))
                    listSameTemp.add(a);
            });
            retList = listSameTemp.stream().distinct().collect(Collectors.toList());
            
            //不同的集合
            if("d".equals(cmpType)){
                List<String> listTemp = new ArrayList<>(listAll);
                listTemp.removeAll(retList);
                retList = listTemp;
            }
            //list1中不在list2中的集合
            if("e".equals(cmpType)){
                List<String> listTemp = new ArrayList<>(list1);
                listTemp.removeAll(retList);
                retList = listTemp;
            }
            //list2中不在list1中的集合
            if("f".equals(cmpType)){
                List<String> listTemp = new ArrayList<>(list2);
                listTemp.removeAll(retList);
                retList = listTemp;
            }
        }
        return retList;
    }    
    
    /**
     * 测试
     */
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<String>();
        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<String> list2 = new ArrayList<String>();
        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"));
        
    }
}

测试结果:


 

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

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>测试user<p>
 * @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<User> list = new ArrayList<User>();
        list.add(new User("1","张三"));
        list.add(new User("2","李四"));
        list.add(new User("3","刘大壮"));
        
        System.out.println("处理前:" + list);
        
        List<String> Useridlist = list.stream().map(User :: getUserid).collect(Collectors.toList());
        
        System.out.println("处理后:" + Useridlist);
    }
    
}

测试结果:

 

posted on 2018-07-18 13:45  漂流的老妖怪  阅读(6705)  评论(0编辑  收藏  举报