JDK1.8 集合常用操作

JDK1.8 常用集合操作
一.forEach操作

userTypeMaps.stream().forEach(p -> {
			userTypeMap.put(p.get("itemDesc"), p.get("itemValue"));
	});//userTypeMaps是List>的集合。根据key值找value

二.分组

// 把listdto跟进分中心进行排序分组
    Map> maps = manPowerDataList.stream()
    .collect(Collectors.groupingBy(ManPowerConfigEntity::getArea));

三.排序后过滤

//以开始区间进行排序
	List rates = bankBusinessSortService.getPartyARankRato()
	rates.sort((u,m)->(u.getSortBegin()==null?"":u.getSortBegin()).compareTo(m.getSortBegin()==null?"":m.getSortBegin()));
    Optional findFirst = rates.stream().filter(u->"F".equals(u.getFirstOrLast())).findFirst();
    if (findFirst.isPresent()) {
       newList.add(findFirst.get());
    }

四.求最大值

ArrayList compilingRuleList =xxoo;
	Optional max = compilingRuleList.stream().max((u1,u2)->u1.getCompilingRateEnd().compareTo(u2.getCompilingRateEnd()));
    double doubleValue = max.get().getCompilingRateEnd().doubleValue();

五. list转为set

List value =xxoo;
	Set aset = value.stream().map(ManPowerConfigEntity::getAreaUM).collect(Collectors.toSet());

六.综合使用

//按照有效月份,主业务线,业务分类分组
CompleteDtos.stream().collect(Collectors.groupingBy(CompleteRateDto::getIdKey)).values().forEach(p->{	
			StringBuilder errorInfo = new StringBuilder();
			//按照最小mob对集合排序
			Collections.sort(p,new Comparator(){
				/*
				 * int compare(CpmpleteDto o1, CpmpleteDto o2) 返回一个基本类型的整型,
				 * 返回负数表示:o1 小于o2,
				 * 返回0 表示:o1和o2相等,
				 * 返回正数表示:o1大于o2。
				 */
				@Override
				public int compare(CompleteRateDto o1, CompleteRateDto o2) {
					//按照最小mob升序排列
					if(o1.getMinMob() > o2.getMinMob()){
						return 1;
					}
					if(o1.getMinMob() == o2.getMinMob()){
						return 0;
					}
					return -1;
				}
			});
			//校验MOB重叠或不连续
			for(int i=1;ip.get(i-1).getMaxMob()) {//mob重叠
					errorInfo.append("业务线代码:"+p.get(0).getBussinessCode()+",业务分类"+p.get(0).getBusssinessClassify()+"分组下催员MOB不连续;");
					break;
					//errorInfo.append("第"+(Integer.valueOf(p.get(i-1).getSeq())+1)+"行与第"+(Integer.valueOf(p.get(i).getSeq())+1)+"行MOB不连续;");
				}
				if(p.get(i).getMinMob()

七.1.8 forEach遍历是引用内部对象操作,属于一个封闭范围,怎么说呢如果代码块不加断点,debug时候工具会把forEach整体当作一句代码跑过,因此foreach应用时,内部代码不能把外部变量带入重新创建新对象;不能抛异常,只能try catch
性能对比:lambda的forEach循环在首次执行的时候会初始化部分内容,从而导致执行过慢,在后续的执行当中由于不需要再次进行初始化,所以才展现出真正的实力。

附:集合的浅复制与深复制
普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域。所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象的浅复制,即只是在栈中拷贝了,而堆中的数据并没有拷贝。而深度复制则是同时在栈中和堆中的数据进行拷贝,这样,其拷贝的集合和被拷贝的集合已经没有任何关系了。

实现深复制有两种方法,1,要复制的对象实现Cloneable接口。并重写克隆方法

public class Address implements Cloneable,Serializable{

private String address;
构造器1;
构造器2;
seter,geter方法
@Override
protected Object clone() {
    Address address = null;
    try {
        address = (Address) super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return address;
}

2.用spring的BeanUtils.copyProperties(dest,src)方法,一次只能拷贝一个bean

ArrayList compilingRuleList =xxxx;
		List grouplist = new ArrayList<>();
        //把compilingRuleList的开始和结束区间的数据封装到其他list的创建和更新字段里。然后进行分组,
        CompilingRuleDto swap;
        for (CompilingRuleDto dto : compilingRuleList) {
            swap = new CompilingRuleDto();
            BeanUtils.copyProperties(swap, dto);
            grouplist.add(swap);
        }
        grouplist.forEach(u->{
            u.setCreatedBy(String.valueOf(u.getCompilingRateBegin()));
            u.setUpdatedBy(String.valueOf(u.getCompilingRateEnd()));
        });

你可能感兴趣的:(java,集合)