Lambda的定义及关系
1.Lambda三种表达式:函数引用,匿名内部类,箭头函数
2.变量、对象、类之间关系
String a="123";//函数引用变量入参和出参对照例子
Supplier<Integer> supplier=a::length;//现有对象的实例方法引用
Function<String, Integer> fun1= String::length;//非静态引用
Function<String, Integer> fun2=Integer::parseInt;//静态方法引用
流式操作
中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。
中间操作又可以分为无状态(Stateless)操作与有状态(Stateful)操作,
前者是指元素的处理不受之前元素的影响;
后者是指该操作只有拿到所有元素之后才能继续下去。
结束操作又可以分为短路与非短路操作,
前者是指遇到某些符合条件的元素就可以得到最终结果;
而后者是指必须处理所有元素才能得到最终结果。
流的原理设计
流的构建
递归带出构建对象,终止递归isEnd
非短路操作,强制求值,包含了递归的应用
public static <T> Stream<T> ofStream(Iterator<T> iterator,boolean isStart ) {
//不仅二叉树可以用递归,链表也可以, 不需要通过stream传递深入构建,但有深度变量
SerialStream<T> serialStream = new SerialStream<>();
if (iterator.hasNext()){
serialStream.isEnd=true;
return serialStream;
}
if (isStart){
serialStream.nextItemProcessor=()->ofStream(iterator,false);//构建头结点就不用深入传递
return serialStream;
}else {
serialStream.data=iterator.next();
serialStream.nextItemProcessor=()->ofStream(iterator,false);
return serialStream;
}
}
二叉树构建,深入优先遍历
private Node<E> addNode(Node<E> root, E value) {
/* If root is null, return null */
if (root == null) {
return null;
}
/* Compare the values and check if we need to
* insert in left subtree or right subtree */
if ((root.value).compareTo(value) <= 0) {
if (root.left != null) {
addNode(root.left, value);
} else {
root.left = new Node<E>(value);
}
} else {
if (root.right != null) {
addNode(root.right, value);
} else {
root.right = new Node<E>(value);
}
}
return root;
}
惰性操作设计
map:入参对应所有集合T=>R
流在并发中的应用
CompletableFuture如果两个future是依赖关系,第二个依赖于第一个,则使用thenCompose