什么是lambda
Lambda 容许把函数做为一个方法的参数,使用 Lambda 表达式能够使代码变的更加简洁紧凑。java
lambda格式
method(param->表达式); //或者 method(param->{ 语句块; });
示例
List<String> 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<String> 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<Long, User> entityMap= userList.stream().collect(Collectors.toMap(User::getId, Function.identity(),(entity1,entity2) -> entity1)); //key是属性,value也是属性 Map<String ,String > 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<String, List<StudentEntity>> stuMap = stuList.stream().collect(Collectors.toMap( //对key的处理方式,此处返回className StudentEntity::getClassName, //对value的处理方式,转换成一个集合 stu -> { List<StudentEntity> list = new ArrayList<>(); list.add(stu); return list; }, //对重复的key进行的操做,进行合并 (oldList, newList) -> { oldList.addAll(newList); return oldList; } ));
map转换list
List<Long> list= roomMap.entrySet().stream().map(item ->item.getValue()).collect(Collectors.toList());
集合去重-属性
集合中存放的是对象,根据对象属性去重blog
List<String> 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<Test> list = Lists.newArrayList(); list.add(test0); list.add(test1); list.add(test2); list.add(test3); List<Test> 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<Test> list=Lists.newArrayList(); list.add(test1); list.add(test2); list.add(test3); Map<String, List<Test>> collect = list.stream().collect(Collectors.groupingBy(Test::getClassName)); collect.forEach((key,value)->{ System.out.println(key+": "+ JSONObject.toJSONString(value)); });
集合分组求和
在上面的"集合分组"例子中,咱们在Test对象里面加入一个int类型的属性count,以表示求和结果。
//单个属性分组 Map<String, IntSummaryStatistics> collect2 = list.stream().collect (Collectors.groupingBy(Test::getClassName, Collectors.summarizingInt(Test::getCount))); collect2.forEach((key,value)->{ System.out.println(key+": "+ JSONObject.toJSONString(value)); });
输出信息以下:
//多个属性分组 Map<String, IntSummaryStatistics> 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<String> result = list.stream().findFirst(); //查找任意一个 Optional<String> result = list.stream().findAny();
LIST查询属性集合
map接口接收一个值,并返回一个值。
List<Long> ids = data.stream().map(Student::getId()).collect(Collectors.toList()); //此写法等同于 List<Long> 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<Integer> 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缺点
- 没法中断循环
- 代码异常没法定位到匿名内部类中具体行数