Predicate:Predicate是个函数式接口,和Function接口一样,不同的是Predicate接口的定义为Predicate<T,Boolean>,也就是Predicate接口定义了接受一个类型为T的参数,返回一个boolean类型的结果。
使用实例:
Student stu=new Student("A",3);
Predicate<Student> predicate=s -> stu.getName.equals("A");
System.out.println(predicate.test(stu));//返回结果为true
Stream:Stream是以一种流式处理的思想对集合的元素进行处理。
使用实例:
List<Student> list=new Arraylist<Student>();
Student aa=new Student("E",3);
list.add(new Student("A",1));
list.add(new Student("B",2));
list.add(new Student("D",4));
list.add(new Student("C",3));
list.add(aa);
list.add(aa);
1.过滤年龄>1的Student:
List<Student> list1=list.stream().filter(s ->s.getAge>1).collect(Collectors.toList());
list1.forEach(stu ->{
System.out.println("stu"+stu.getName()+":"+stu.getAge());
});
2.过滤排序
List<Student> list1=list.stream().filter(s ->s.getAge>1).sorted((stu1,stu2) ->stu1.getAge()-stu2.getAge()).distinct().skip(2).collect(Collectors.toList());
distinct() 无参数,过滤Stream中的重复元素,得到是无重复元素的Stream,重复元素的依据是元素的equals方法
peek(Consumer) peek接收的参数为Consumer类型,Consumer在之前讲到过接收一个T类型参数,无返回值,这是peek方法和map方法的主要区别,peek用来处理无返回值的操作,比如打印元素,而map用来处理有返回值的操作。
sorted() 和上面的带参数的sorted一样,只不过这个无参数,按照对象自定义的Comparator接口实现。如果对象未实现Comparator接口会报错。
skip(long) 跳过Stream中的前n个元素,如果Stream元素个数小于n,返回空的stream
limit(long) 获取Stream中的前n个元素,如果Stream元素个数小于n,返回全部元素
Optional:
Optional.ofNullable(T t) 获取一个内部元素为t的Optional对象,t如果为空,则返回空的Optional对象
ifPresent(Consumer) 判断一个Optional内部的元素是否为空,为空不执行consumer,不为空会执行consumer
orElseGet(Supplier) 尝试从Optional中获取其元素,如果Optional为空,则执行Supplier函数提供一个元素返回,否则返回Optional中的元素
使用实例:
Student aa1=new Student("H",7);
Optional.ofNullable(aa1).orElseGet(() -> {
return null;
});
Optional.ofNullable(aa1).ifPresent(
stp -> { system.out.println("sss");}
);
集合转换:
1.List转set:
Set<Student> set=list.stream().collect(Collectors.toSet());
2.List转map
Map<Integer,Object> map=list.stream().collect(Collectors.toMap(Student::getAge,Student -> Student,(stu1,stu2)-stu2));//其中的 (stu1, stu2) -> stu2 表示当遇到重复元素时保留新的值
我们如果希望当遇到重复的key时判断name的长度,name较长的保留,则可以写成下面的方式:
.collect(Collectors.toMap(stu -> stu.getAge(), stu -> stu,
(stu1, stu2) -> stu1.getName().length() > stu2.getName().length() ? stu1 : stu2));
3.按照年龄分组:
Map<Integer,List<Student>> maplist=list.stream().collect(Collectors.groupingBy(Student::getAge));
maplist.foreach((k,v) ->{
System.out.println("k:"+k+"v:"+v);
})
4.获取名称列表
List<String> namelist=list.stream().map(Student -> Student.getName()).collect(Collectors.toList());
5.使用lambda表达式简化4
List<String> namelist=list.stream().map(Student::getName).collect(Collector.toList());
6.replaceAll
List<String> list=Arrays.asList("111-222-333“,”444-555-666");
list.replaceAll(temp -> temp.replace("-",""));
7.merge
Map<String,String> map=new HashMap<String,String>();
map.put("ss","ss");
map.merge("ss","hh",String::concat);