方法引用
若lambda表达式的内容有方法已经实现了,我们可以用方法引用
主要有以下三种格式:
1、对象::实例方法名
2、类::静态方法名
3、类::实例方法名
注:lambda中调用方法的参数列表与返回值类型,要与函数式接口中抽象方法的函数列表和返回值类型一致
若lambda表达式中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以用className::method
构造器引用
格式
className::new
注:需要调用的构造器的参数列表需要与函数式接口中抽象方法的参数列表保持一致
@Test
public void Test1() {
Supplier<Student> supplier = () -> new Student(); //使用Lambda表达式
Supplier<Student> supplier1 = Student::new; //使用构造器引用
}
@Test
public void Test2() {
Function<String, Student> function1 = (name) -> new Student(name); //使用Lambda表达式
Function<String, Student> function2 = Student::new; //使用构造器引用
System.out.println(function1.apply("Moti"));
System.out.println(function2.apply("Moti"));
BiFunction<String, Integer, Student> function3 = (name,age) -> new Student(name, age);//使用Lambda表达式
BiFunction<String, Integer, Student> function4 = Student::new; //使用构造器引用
System.out.println(function3.apply("Moti",20));
System.out.println(function4.apply("Moti",20));
}
Stream
概念:
是数据渠道,用于操作数据源所生成的元素序列
注:
stream自己不会存储元素
stream不会改变源对象,相反,他们会返回一个持有新结果的新stream
stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行
使用
1、创建Stream
1)可以Collection系列集合提供的stream()或parallelStream()生成串行或并行流
2)通过Arrays中的静态方法stream()获取数组流
3)通过Stream类中的静态方法of()
4)创建无限流
迭代
Stream<Integer> infiniteStream = Stream.iterate(0, i -> i + 2);
生成
Stream.generate(()->Math.random())
2、中间操作
filter:接收lamba,从流中排除某些元素
limit:截断流,使其元素不超过给定数量
skip(n):跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流
distinct:筛选,通过流所生成元素的hashCode()和equals()去除重复元素
map:接收lambda,将元素转换成其他形式提取信息。接收一个函数作为参数,该函数会被应用到每一个元素上,并映射成一个新元素
flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
3、终止操作
一次性执行完全部操作
查找与匹配
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 检查是否没有匹配所有元素
findFirst() 返回第一个元素
findAny() 返回当前流中的任意元素
count() 返回流中总数
max(Comparator c) 返回流中最大值
min(Comparator c) 返回流中最小值
forEach(Consumer c) 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)
规约
reduce(T iden, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T
reduce(Binar yOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional
collect (Collector c) 将流转换为其他形式,接收一个Collector接口的实现,用于给Stream中元素做汇总的方法
Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List,Set,Map).但是Collectors实现类中提供了许多静态方法,可以方便的创建常见的收集器实例.
参考:https://blog.csdn.net/qq_43386754/article/details/102522277
Optional
empty 放回一个值为空的Optional实例
filter 如果值存在并且满足提供的谓词,就返回包含该Optional对象;否则返回一个空的Optional对象
flatMap 如果值存在,就对该值执行提供的mapping函数,将mapping函数返回值用Optional封装并返回,否则就返回一个空的Optional对象
get 如果值存在就返回该Optional对象,否则就抛出一个 NoSuchElementException异常
ifPresent 如果值存在就对该值执行传入的方法,否则就什么也不做
isPresent 如果值存在就返回true,否则就返回false
map 如果值存在,就对该值执行提供的mapping函数调用,将mapping函数返回值用Optional封装并返回
of 如果传入的值存在,就返回包含该值的Optional对象,否则就抛出NullPointerException异常
ofNullable 如果传入的值存在,就返回包含该值的Optional对象,否则返回一个空的Optional对象
orElse 如果值存在就将其值返回,否则返回传入的默认值
orElseGet 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的值
orElseThrow 如果值存在就将其值返回,否则返回一个由指定的Supplier接口生成的异常
接口默认方法与静态方法
接口默认方法的类优先原则
若接口中定义了一个默认方法,而另一个父类或接口中又定义了一个同名的方法时:
1)选择父类中的方法。如果父类提供了具体实现,那么接口中的具有相同名称和参数的默认方法会被忽略。
2)接口冲突:如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法,那么必须覆盖该方法来解决冲突
可以在复写的方法中指定调用哪一个接口的方法
class Student implement Person,Named{
public String getName(){
return Person.super.getName();
}
}
java8时间日期类
时间戳:以unix元年:1970.01.01 00:00:00到某个时间之间的毫秒值
https://www.jianshu.com/p/3208f0b31dd5