目录
1.lambda表达式:
2.stream的用法:
3.DateApi类:
4.接口新特性:
java中的函数式接口都可以使用lambda表达式来表示,所谓函数式接口(Functional Interface)是指包含一个方法的抽象接口(SAM)。
格式:lambda表达式实际上就是代码块的传递的实现
(parameters) -> expression 或者 (parameters) -> {statements;}
注意事项:
a.括号里的参数可以省略其类型,编译器会根据上下文来推导参数的类型,你也可以显式地指定参数类型,如果没有参数,括号内可以为空。
b.方法体,如果有多行功能语句用大括号括起来,如果只有一行功能语句则 可以省略大括号。
c.可替代匿名内部类。
public class LambdaDemo {
public static void main(String[] args) {
/**
* 使用lambda处理多线程
* public Thread(Runnable commend){}
* Runnable是函数式接口
*/
//正常写法:使用匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("***");
}
}).start();
//使用lambda表达式的写法,Runnable是函数式接口
new Thread(()->System.out.println("...")).start();
Runnable r = ()->System.out.println("ddd");
new Thread(r).start();;
/**
* 使用lambda处理集合的排序:过滤器
* Collections.sort(List list,Comparator c)
* list.sort(Comparator c);
* Comparator是函数式接口
*/
List list = Arrays.asList(12,43,65,35,5);
Collections.sort(list, (o1,o2)->o2-o1);
System.out.println(list); //降序:[65, 43, 35, 12, 5]
list.sort((o1,o2)->o2-o1);
System.out.println(list); //降序:[65, 43, 35, 12, 5]
/**
* 使用lambda处理集合的遍历:
* list.forEach(Consumer c);
* map.forEach(BiConsumer action);
* Consumer和BiConsumer都是函数式接口
*/
list.forEach((t)->System.out.println(t));
list.forEach(System.out::println);
Map map = new HashMap<>();
map.put(1, "s");
map.put(2, "s1");
map.put(3, "s2");
map.forEach((k,v)->System.out.println(k+"="+v));
}
}
方法引用:
是lambda表达式的简写形式,如果lambda表达式只是调用一个特定的已经存在的方法,则可以使用方法引用。
使用“::”操作符将方法名和对象或类的名字分隔开来。
list.forEach((t)->System.out.println(t));
list.forEach(System.out::println);
Stream接口位于java.util.stream包中,是一个来自数据源的元素队列并支持聚合操作:
JDK8以后,public final class StreamSupport{},无论哪种方式创建的stream()方法,底层都是调用的StreamSupport类中的stream()方法。
获取Stream对象的五种方式:
使用集合创建:
List list = Arrays.asList(1,5,6,3,8);
Stream stream = list.stream();
使用数组创建:
String[] arr = {"燃","冬","青"};
Stream stream2 = Arrays.stream(arr);
使用value创建:
Stream stream3 = Stream.of(1,2,5,3);
使用iterate创建:
Stream stream4 = Stream.iterate("h", n->n+5).limit(5);
stream4.forEach(System.out::print); //hh5h55h555h5555
使用generate创建:
Stream stream5 = Stream.generate(Math::random).limit(2);
stream5.forEach(System.out::println);
==========================================
0.7759721033380993
0.11476503584538988
获得Stream接口的对象后,都可以使用匿名内部类或lambda表达式的形式传参,从而调用接口中的方法。下面以集合为例,列举常用的几种方法的使用:
JDK8以前接口中只有抽象方法,子类实现接口时需要重写接口中的抽象方法。而在类的继承中,子类是可以继承父类的一些方法的。JDK8关于接口的特性修改,使得接口中可以定义所有子类都会需要的方法,这样不需要重写就可以继承下来。有助于接口的功能扩展以及打破单继承局限。近似的取代了抽象类的作用。
public interface Demo08 {
void show(int a);
default void text() {
System.out.println("JDK8中的接口新特性...");
}
}
Spliterator是一个可分割迭代器(splitable iterator),可以和iterator顺序遍历迭代器一起看。jdk1.8发布后,对于并行处理的能力大大增强,Spliterator就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了spliterator。
spliterator类的数据结构: