1、我们目前为止,学了几个函数式接口,都有什么用?
Runnable:创建线程任务 run()
Comparator<T>:排序 compare(T o1,T o2) 将数据按照指定顺序排列
FileFilter:文件过滤器,accept(File f) 过滤出想要的文件
supplier<T>:生产者 T get();生产(创建)一个对象
consumer<T>:消费者 accept(T t);消费(操作)一个对象
Function<T,R>:数据转换 R apply(T t) 转换传入的数据类型(值)
Predicate:数据判断 boolean test(T t) 判断传入的数据
2、获取流有几种方式?
单列集合获取:
Collection.Stream();
双列集合获取:
Map.entry.Stream()
Map.keySet().stream()
Map.value().stream()
数组获取方式:调用默认方法
Stream.of(T...t);
3、结合最近所学,请谈谈你对函数式接口以及Stream流的理解
函数式接口,有且只有一个抽象方法的接口,在1.8的特性上通过Lambda的引入与方法引用的配合优化了匿名内部类需要创建各种对象而导致的臃肿的代码,基于Lambda的使用上具有延迟性,强调做什么,而不是怎么做,由面向对象转向了面向函数;
Stream,将其比作管道,数据的流动就在其中进行,而它的方法功能好比自来水净水厂,对管道中的数据进行加工操作,通过一步步的筛选,
最终得到想要的结果.通过极少的步骤便可对巨量的数据进行筛选,且具有延迟性,极大地提高了开发效率,美中不足的是,每个Stream流只能消费(操作)一次,且在其中流动的数据
流向单一不可逆,并且如果未编写终止方法,那么中间的操作步骤将无法得到实现. |