package com.example.demo;
import org.assertj.core.util.Lists;
import javax.sound.midi.SysexMessage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 参考:https://blog.csdn.net/EQuaker/article/details/86561781
* https://www.cnblogs.com/yunqing/p/9221117.html
* 1. 函数式编程:(两个特点)
* 可以把函数作为参数传递给另一个函数,也就是所谓的高阶函数
* 可以返回一个函数,这样就可以实现闭包或者惰性计算(闭包:A函数返回B函数,B函数使用了A中的变量,则相当于扩大了A中变量的作用范围;放回方法,可以延迟执行)
* 2. 函数式接口(只有一个抽象方法,可以有多个默认实现方法或静态方法)
* Consumer<T>:消费性接口
* Supplier<T> 供给型接口
* Function<T,R> 函数型接口
* Predicate<T> 断言型接口
* 3. 兰姆达表达式(函数式接口的实现)
* (参数,一个时可省略括号) -> {函数实现,一条语句可以不用括号及返回return}
* 4. 方法引用(进一步简化lambda表达式的声明)
* objectName::instanceMethod
* ClassName::staticMethod
* ClassName::instanceMethod (把lambda表达式的第一个参数当成instanceMethod的目标对象,其他剩余参数当成该方法的参数。)
* 5. 流stream
* 1).Stream是元素的集合,这点让Stream看起来用些类似Iterator;
* 2).可以支持顺序和并行的对原Stream进行汇聚的操作;(直接告诉程序要做什么,如转换成大写,怎么做(如并行还是串行等)让计算机自己决定)
* 使用步骤:stream创建、转换、聚合(Reduce)
* (转换操作都是lazy的,多个转换操作只会在汇聚操作(见下节)的时候融合起来,一次循环完成。
* 我们可以这样简单的理解,Stream里有个操作函数的集合,每次转换操作就是把转换函数放入这个集合中,
* 在汇聚操作的时候循环Stream对应的集合,然后对每个元素执行所有的函数。)
* (汇聚操作(也称为折叠)接受一个元素序列为输入,反复使用某个合并操作,把序列中的元素合并成一个汇总的结果。
* 比如查找一个数字列表的总和或者最大值,或者把这些数字累积成一个List对象。Stream接口有一些通用的汇聚操作,
* 比如reduce()和collect();也有一些特定用途的汇聚操作,比如sum(),max()和count()。)
*
*/
public class TestLamda {
public static void main(String[] args){
// testStream();
testConsumer(10,(i) -> System.out.println(i*10));
}
static void testConsumer(int i,Consumer<Integer> consumer){
consumer.accept(i);
}
public static void testStream(){
//1. 创建:Collection(集合子类).stream();Stream.of;generate;iterate
//2. 转换:distinct;filter;map;flatMap;peek;limit;skip;
//3. 汇聚:
// 1)可变汇聚:collect 2)其他汇聚:reduce;count;allMatch;anyMatch;findFirst;noneMatch;max;min
List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
Stream<Integer> integerStream = Stream.of(1, 2, 3, 5);
Stream.generate(() -> Math.random());
Stream.generate(Math::random);
Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
System.out.println("result: "+nums.stream().filter(s -> s == null).count());
System.out.println("sum is:"+nums.stream().filter(num -> num != null).distinct().mapToInt(num -> num * 2)
.peek(System.out::println).skip(2).limit(4).sum());
//汇聚
List<Integer> nums2 = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
List<Integer> numsWithoutNull = nums2.stream().filter(num -> num != null).
collect(() -> new ArrayList<Integer>(),//生成容器
(list, item) -> list.add(item),//元素添加到容器
(list1, list2) -> list1.addAll(list2));//多个结果容器合并操作
List<Integer> numsWithoutNull2 = nums2.stream().filter(num -> num != null).
collect(Collectors.toList());
List<Integer> ints = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10);
System.out.println("ints sum is:" + ints.stream().reduce((sum, item) -> sum + item).get());
}
}
来源:https://blog.csdn.net/weixin_42621956/article/details/99329919