什么是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缺点
没法中断循环
代码异常没法定位到匿名内部类中具体行数