在Java 8及以后的版本中,引入了新的Stream API,这个API提供了一组新的操作方法,可以便捷
地对Java集合进行过滤、映射、排序、分组等操作。
在Stream API中主要分中间操作,和终止操作
中间操作是对流进行处理但不产生最终结果的操作。中间操作可以被连续地串联起来形成一个操作流水线,最终由终止操作来触发流的执行。中间操作是懒执行的,只有在触发终止操作时,中间操作才会被执行,中间操作函数还有对应的子中间操作函数可调用
简单一句话就是Stream在中间操作流转变化,所以中间操作方法都是返回流
终止操作是用于触发流流水线执行并产生最终结果的操作。它会产生一个非流的结果,如集合、数组、单个元素或者副作用。终止操作是惰性求值的,也就是说,只有在调用终止操作时,中间操作才会被执行。这种设计可以实现更高效的数据处理,避免不必要的计算。
简单一句话就是Stream在终止操作决定返回什么值
常用的中间操作:
List numbers = Arrays.asList(1, 2, 3, 4, 5);
List filteredNumbers = numbers.stream()
.filter(n -> n % 2 == 0) // 筛选出偶数
.collect(Collectors.toList());
Function
类型的参数,该函数接受一个输入元素,并返回一个经过映射处理后的输出元素流。Function
类型的参数,该函数接受一个元素作为输入,并返回一个包含多个元素的流 List words = Arrays.asList("Hello", "World", "Java");
List letters = words.stream()
.flatMap(word -> word.chars().mapToObj(c -> (char) c))
.collect(Collectors.toList());
System.out.println(letters);
//输出[H, e, l, l, o, W, o, r, l, d, J, a, v, a]
Comparator返回流
sorted(Comparator.comparing(类型名称::类型属性))//默认数字排序和按照字母顺序排序
Consumer
参数,如打印或调试。注意peek方法不能用于修改元素常用的终止操作:
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
Comparator返回
Optional对象 List numbers = Arrays.asList(1, 10, 5, 8, 3);
Optional max = numbers.stream()//如果流为空,则返回一个空的 Optional 对象
.max(Comparator.naturalOrder());//Comparator.naturalOrder() 比较器,该比较器使用元素的自然顺序进行比较。
// 输出 10
max.ifPresent(System.out::println);//ifPresent 方法判断结果是否存在,如果存在则打印最大值。
List students = Arrays.asList(
new Student("Tom", 80),
new Student("Jerry", 90),
new Student("Mickey", 70)
);
int sum = students.stream()
.mapToInt(Student::getScore)//这里和map传的FUNCTION类型参数
.sum();
理解这些操作还需要理解几个名词
1.谓词(Predicate): 谓词是一个函数接口,它接受一个参数并返回一个布尔值。一般用于filter,takeWhile与dropWhile
2.Consumer :
Consumer
是一个函数式接口,在 Java 中属于 java.util.function
包下。它定义了一个具有一个输入参数的操作,并且没有返回值。一般用于forEach与peek
Consumer
接口有一个抽象方法 accept(T t)
,该方法接受一个输入参数,并且对该参数进行处理操作。
3.Comparator:Comparator
是Java中用于比较对象的接口。它定义了比较两个对象的规则,用于在排序、查找等操作中确定对象的顺序。一般用于sorted ,max,min
Comparator
接口有一个用于比较的方法:compare(T obj1, T obj2)
。该方法接受两个参数,并返回一个整数值,表示比较结果的大小关系。
4.函数式接口 Function
类型的参数,该接口接受一个输入元素,并返回指定类型的元素流。
一般用于map, flatMap 等map相关函数
5.归约(reduce)操作 其中最常用的形式接受一个二元操作符(BinaryOperator)作为参数,来完成归约操作,这个下篇文章写