stream
中间操作,每次返回一个新的流,可以有多个。
终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。
无状态:指元素的处理不受之前元素的影响;
有状态:指该操作只有拿到所有元素之后才能继续下去。
非短路操作:指必须处理所有元素才能得到最终结果;
短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果。
创建流
List<String> list = Arrays.asList("a", "b", "c");
// 创建一个顺序流
Stream<String> stream = list.stream();
// 创建一个并行流
Stream<String> parallelStream = list.parallelStream();
stream和 parallelStream的简单区分:stream是顺序流,由主线程按顺序对流执行操作,而 parallelStream是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:
map
Stream.map()是Stream最常用的一个转换方法,它把一个Stream转换为另一个Stream。
map操作,把一个Stream的每个元素一一对应到应用了目标函数的结果上
public class Main {
public static void main(String[] args) {
List.of(" Apple ", " pear ", " ORANGE", " BaNaNa ")
.stream()
.map(String::trim) // 去空格
.map(String::toLowerCase) // 变小写
.forEach(System.out::println); // 打印
}
}
函数式编程
函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。
FunctionalInterface
只定义了单方法的接口称之为FunctionalInterface,用注解@FunctionalInterface标记。
Lambda表达式
- Lambda表达式的参数和返回值均可由编译器自动推断。
- lambda表达式仅能放入如下代码: 预定义使用了 @Functional 注释的函数式接口,自带一个抽象函数的方法,或者SAM(Single Abstract Method 单个抽象方法)类型。
- lambda表达式限制,只能引用 final 或 final 局部变量,
方法引用
构造引用
Supplier<Student> s = Student::new;
类名::静态方法
Stream<Double> stream = Stream.generate(Math::random);
类名::实例方法
TreeSet<String> set = new TreeSet<>(String::compareTo);