Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。使用 Lambda 表达式可以使代码变的更加简洁紧凑。在实际工作中我一般会使用lambda表达式将集合根据某个条件过滤,分组,排序,转为map.
基础代码
List<Person> list = new ArrayList<>();
list.add(new Person(11,"张三","男"));
list.add(new Person(30,"李四","女"));
list.add(new Person(20,"王五","男"));
- 单个条件过滤(年龄大于15岁的)
list = list.parallelStream().filter(av -> av.getAge() > 15 ).collect(Collectors.toList());
- 多个条件过滤(年龄大于15岁,性别男)
Predicate<Person> conditionOne = (p) -> p.getAge() > 15;
Predicate<Person> conditionTwo = (p) -> p.getSex() .equals("男");
list = list.parallelStream().filter(conditionOne.and(conditionTwo)).collect(Collectors.toList());
list.forEach(System.out::println);
filter传入Predicate接口,主要有三个方法,and or negate 对别对应 && || !
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
- 根据性别分组,将list转化为map
Map<String, List<Person>> map = list.parallelStream().collect(Collectors.groupingBy(Person::getSex));
System.out.println(map);
结果:
{女=[Person(age=20, name=李四, sex=女)], 男=[Person(age=11, name=张三, sex=男), Person(age=20, name=王五, sex=男)]}
- 根据年龄排序,指定多个字段排序,降序使用reversed()方法
list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed().thenComparing(Person::getSex)).collect(Collectors.toList());
- 获取集合对象某个属性的集合比如ID
List<String> result= list.parallelStream().map(Person::getName).collect(Collectors.toList());
- 获取将集合对象的ID作为key,对象作为value的map,注意不是有序的,如果需要有序的,使用LinkHashMap遍历添加
Map<String, Person> map = list.stream().collect(Collectors.toMap(Person::getName, ev -> ev));