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

测试结果:

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. 转 Ubuntu16.04+QT4.8.7开发环境搭建

    Qt安装步骤1.安装g++以及依赖库 sudo apt-get install g++  sudo apt-get install g++-multilib libx11-dev libxext-de ...

  2. Camp 前三日简单总结

    1.#include <bits/stdc++.h> 后面别再忘了写 using namespace std; 2.在#include <bits/stdc++.h> 中 可以 ...

  3. 删除DataTable的指定行(Lambda)

    DataTable dtTcu = GetAllTcuInfoBySdId(sdId); DataTable dtToesm = GetAllToesmBySdId(sdId); foreach (D ...

  4. Linux运维宝典:最常用的150个命令汇总

    一.线上查询及帮助命令(2个) 二.文件和目录操作命令(18个) 三.查看文件及内容处理命令(21个) 四.文件压缩及解压缩命令(4个) 五.信息显示命令(11个) 六.搜索文件命令(4个) 七.用户 ...

  5. spring boot profiles 实现多环境下配置切换 docker版

    1,前言 开发环境总需要调试,docker直接部署不需要调试,环境配置不一样,这里的目的只是,在docker文件环境与开发环境使用不同的配置文件,项目结构如下 2,设置项目配置文件 默认配置文件 ap ...

  6. docker 搭建 hustoj

    docker 搭建 hustoj hustoj 是个GPL开源的OJ,其提供了docker形式的安装方式. 为执行方便,选择使用aliyun提供的docker镜像来加速安装. 拉取镜像 docker ...

  7. C#学习-图解教程(1):格式化数字字符串

    学习内容:C#:学习书籍:图解教程(中文第四版). 目录:第二章 C#编程概述 -----> 2.7 从程序中输出文本 -----> 2.7.5格式化数字字符串 using System; ...

  8. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  9. c# 复制整个文件夹的内容,Copy所有文件

    /// <summary> /// 文件夹下所有内容copy /// </summary> /// <param name="SourcePath"& ...

  10. 【HQL】函数汇总

    背景 抽空整理一篇HQL函数及常用的小技巧 COALESCE COALESCE(T v1, T v2, -) 返回参数中的第一个非空值:如果所有值都为NULL,那么返回NULL