lambda 根据属性去重_java的lambda表达式 和stream接口使用

什么是lambda

Lambda 容许把函数做为一个方法的参数,使用 Lambda 表达式能够使代码变的更加简洁紧凑。java

lambda格式

method(param->表达式);

//或者

method(param->{

语句块;

});

示例

List list=Lists.newArrayList();

list.add("jack");

list.add("test");

//表达式示例:判断是否有匹配

boolean match=list.stream().anyMatch(item->item.equals("test"));

//语句块示例:循环

list.stream().forEach(item->{

String sayHi="hi,"+item;

System.out.println(sayHi);

});

多线程示例

接下来咱们看一下使用lambda方式新建线程。

普通新建一个线程:多线程

new Thread(new Runnable() {

@Override

public void run() {

System.out.println("do something");

}

}).start();

使用lambda方式:ide

new Thread(() -> System.out.println("do something")).start();

能够看出使用lambda会使代码更加简洁优美。函数

集合循环

普通集合循环:线程

List names = Lists.newArrayList();

for (String name : list) {

System.out.println(name);

}

使用lambda方式:3d

names.stream().forEach(name-> System.out.println(name));

Collection接口的stream方法

集合下的stream方法有多种用处,下面举几个经常使用的例子:指针

集合循环

list.stream().forEach(item->{.....})

Map循环

notExistsSchool.entrySet().stream().forEach(item -> {

dosomething

});

List过滤

根据条件过滤,并返回一个新的集合code

list=list.stream().filter(item->{

return item.equals("test")?false:true;

}).collect(Collectors.toList());

list转换成map-value覆盖

//key是属性,value是对象

Map entityMap= userList.stream().collect(Collectors.toMap(User::getId,

Function.identity(),(entity1,entity2) -> entity1));

//key是属性,value也是属性

Map grandClass=dataList.stream().collect(Collectors.toMap(User::getUserId,

User::getUserName,(entity1,entity2) -> entity1));

list转换成map-value合并

list对象中的一个属性做为key,相同的key合并成一个集合。对象

定义entity:

public class StudentEntity {

private String className;

private String studentName;

}

进行转换:

Map> stuMap = stuList.stream().collect(Collectors.toMap(

//对key的处理方式,此处返回className

StudentEntity::getClassName,

//对value的处理方式,转换成一个集合

stu -> {

List list = new ArrayList<>();

list.add(stu);

return list;

},

//对重复的key进行的操做,进行合并

(oldList, newList) -> {

oldList.addAll(newList);

return oldList;

}

));

map转换list

List list= roomMap.entrySet().stream().map(item ->item.getValue()).collect(Collectors.toList());

集合去重-属性

集合中存放的是对象,根据对象属性去重blog

List gradeCodes = dataList.stream().map(ExcelStuBean::getGradeCode).distinct().collect(Collectors.toList());

集合去重-对象

若是集合中存在多个属性相同的对象,去重须要重写equals和hashcode方法。

//Test须要重写equals和hashcode方法

Test test0 = new Test("海淀一小", "一年级", "jack");

Test test1 = new Test("海淀一小", "一年级", "jack");

Test test2 = new Test("海淀一小", "一年级", "tom");

Test test3 = new Test("海淀一小", "二年级", "ahuang");

List list = Lists.newArrayList();

list.add(test0);

list.add(test1);

list.add(test2);

list.add(test3);

List distinctList = list.stream().map(stu -> {

return stu;

}).distinct().collect(Collectors.toList());

distinctList.stream().forEach(item -> {

System.out.println(JSONObject.toJSONString(item));

});

输出信息以下:

集合分组

Test test1 = new Test("海淀一小","一年级","jack");

Test test2 = new Test("海淀一小","一年级","tom");

Test test3 = new Test("海淀一小","二年级","ahuang");

List list=Lists.newArrayList();

list.add(test1);

list.add(test2);

list.add(test3);

Map> collect = list.stream().collect(Collectors.groupingBy(Test::getClassName));

collect.forEach((key,value)->{

System.out.println(key+": "+ JSONObject.toJSONString(value));

});

集合分组求和

在上面的"集合分组"例子中,咱们在Test对象里面加入一个int类型的属性count,以表示求和结果。

//单个属性分组

Map collect2 = list.stream().collect

(Collectors.groupingBy(Test::getClassName, Collectors.summarizingInt(Test::getCount)));

collect2.forEach((key,value)->{

System.out.println(key+": "+ JSONObject.toJSONString(value));

});

输出信息以下:

//多个属性分组

Map collect3= list.stream().collect

(Collectors.groupingBy(item->{

return item.getSchoolName()+"-"+item.getClassName();

}, Collectors.summarizingInt(Test::getCount)));

collect3.forEach((key,value)->{

System.out.println(key+": "+ JSONObject.toJSONString(value));

});

输出信息以下:

成员属性求sum

BigDecimal reduce = pList.stream().map(Person::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);

System.out.println("工资总计:" + reduce);

属性判断

//任意一个匹配

data.stream().anyMatch(item->item.getCity().equals("北京"));

//所有匹配

data.stream().allMatch(item->item.getCity().equals("北京"));

成员查找

//查找第一个

Optional result = list.stream().findFirst();

//查找任意一个

Optional result = list.stream().findAny();

LIST查询属性集合

map接口接收一个值,并返回一个值。

List ids = data.stream().map(Student::getId()).collect(Collectors.toList());

//此写法等同于

List ids = data.stream().map(student->student.getId()).collect(Collectors.toList());

排序

//正排序

regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort)).collect(Collectors.toList());

//倒排序

regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort).reversed()).collect(Collectors.toList());

求最大值

经过reduce计算,好比说我须要求出学生信息中最高分。

//接上面的信息map,咱们改写成求最大分数

Optional maxScore=data.stream().map(Student::getScore()).reduce(Integer::max);

//此写法等同于

int maxScore=data.stream().map(Student::getScore()).reduce(Integer::max).orElse(0);

注意reduce返回的是Optional类型,这是java8中新添加的,主要是防止空指针。

strem缺点

没法中断循环

代码异常没法定位到匿名内部类中具体行数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值