Stream流式表达
1.Stream常用方法:
终结方法:返回值类型不再是Stream类型的方法,不再支持链式调用,其中主要包括count,forEach,reduce方法。
非终结方法:返回值类型仍然是Stream类型的方法,支持链式调用,除了终结方法count,forEach,reduce方法之外,其余方法均为非终结方法
2.Stream注意事项:
Stream的非终结方法执行返回的是新的流。
Stream如果不调用终结方法,每一次的非终结方法的执行都会将前一个流中的数据进行覆盖。
3.方法介绍:
forEach:遍历流中的数据
public static void main(String[] args) {
Stream.of("aa","ac","bb","dd").forEach(System.out::println);
}
count:统计流中的数据个数
public static void main(String[] args) {
Stream<String> stream = Stream.of("aa", "ac", "bb", "dd");
System.out.println(stream.count());
}
filter:过滤数据,返回符合条件的数据。可以通过该方法将一个流转换成另一个子集流。
该方法需要接收一个Predicate函数式接口参数作为筛选条件。
public static void main(String[] args) {
Stream.of("aa","ac","bb","dd").filter(s ->
s.contains("a")).forEach(System.out::println);
}
limit:可以对流进行截取处理,只取前n个数据。参数是一个long类型的数值
public static void main(String[] args) {
Stream.of("aa","ac","bb","dd").limit(3).forEach(System.out::println);
}
skip:可以跳过前面的几个数据,获取一个去掉前部分数据的流
public static void main(String[] args) {
Stream.of("aa","ac","bb","dd").skip(3).forEach(System.out::println);
}
map:该方法需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一
种R类型数据
public static void main(String[] args) {
Stream.of("1","2","3","4","5","6","7").
map(Integer::parseInt).forEach(System.out::println);
}
sort:将流中的数据进行排序
public static void main(String[] args) {
Stream.of("1","2","3","4","5","1","6","7").
map(Integer::parseInt).
sorted((o1,o2)->o1-o2).forEach(System.out::println);
}
distinct:去除流中的重复数据。该方法对于基本数据类型是可以直接去重的,但是对于自
定义类型,需要重写hashCode和equals方法来移除重复元素
public static void main(String[] args) {
Stream.of("1","2","3","4","5","1","6","7").
map(Integer::parseInt).sorted((o1,o2)->o2-o1).distinct().
forEach(System.out::println);
}
reduce:可以将流中的所有数据归纳得到一个数据
public static void main(String[] args) {
//identify:赋给x的初始值 x:每一次循环的结果 y:接收流中的每一个数据
System.out.println(Stream.of(4, 5, 9, 3).reduce(0, (x, y) -> x>y?x:y));
}
map与reduce的整合:求出所有人的年龄总和
public static void main(String[] args) {
Integer ageSum = Stream.of(
new Person("张三", 13),
new Person("李四", 14),
new Person("王五", 15),
new Person("赵六", 16),
new Person("刘七", 17)
).map(person -> person.getAge()).reduce(0,Integer::sum);
System.out.println(ageSum);
}
concat:该静态方法可以将两个流进行合并
public static void main(String[] args) {
Stream stream1 = Stream.of("1", 1, "2", 2);
Stream stream2 = Arrays.asList("a", 3, "b", 4).stream();
Stream.concat(stream1, stream2).forEach(System.out::println);
}