Stream
Stream流中的常用方法
这些方法可以被分成两种:
- 延迟方法:返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用。
- 终结方法:返回值类型不再是 Stream 接口自身类型的方法,因此不再支持类似 StringBuilder 那样的链式调用。
1.forEach(终结方法) ----> 遍历
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.stream().forEach(s -> {
System.out.println(s);
});
}
打印结果:
2.filter ----> 过滤
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.stream().filter(s -> s.startsWith("张")).forEach(s -> {
System.out.println(s);
});
}
打印结果:
3.map ----> 映射(转换)
如果需要将流中的元素映射到另一个流中,可以使用 map 方法。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
Stream<Integer> stream = list.stream().map(s -> Integer.parseInt(s));
stream.forEach(s -> {
System.out.println(s);
});
}
打印结果:
4.count(终结方法)----> 统计个数
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
long count = list.stream().count();
System.out.println(count);
}
打印结果:
5.limit ----> 取用前几个(截取):
参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.stream().limit(3).forEach(s -> {
System.out.println(s);
});
}
打印结果:
6.skip ----> 跳过前几个元素
如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.stream().skip(3).forEach(s -> {
System.out.println(s);
});
}
打印结果 :
7.concat ----> 组合(合并流)
public static void main(String[] args) {
Stream<String> streamA = Stream.of("张无忌");
Stream<String> streamB = Stream.of("张翠山");
//合并成一个新的流
Stream.concat(streamA, streamB).forEach(s -> {
System.out.println(s);
});
}
打印结果:
8.distinct ----> 筛选(去除流中重复的元素)
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
list.add("赵六");
list.stream().distinct().forEach(s -> {
System.out.println(s);
});
}
打印结果:
9.sorted ----> 自然排序
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(124);
list.add(2);
list.add(15);
list.add(12);
list.add(51);
list.add(-5);
list.add(5);
// 按照自然排序
list.stream().sorted().forEach(System.out::println);
}
打印结果:
10. allMatch,anyMatch,noneMatch ----> 检测匹配(终结方法)
是否全部匹配:allMatch
是否至少匹配一个:anyMatch
是否没有匹配的:noneMatch
返回一个Boolean值
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(124);
list.add(2);
list.add(15);
list.add(12);
list.add(51);
list.add(-5);
list.add(5);
// 判断是否全部大于5
boolean b = list.stream().allMatch(i -> i > 5);
System.out.println(b); //false
// 检测是否匹配至少一个元素
boolean b1 = list.stream().anyMatch(i -> i > 5);
System.out.println(b1); //true
// 检查是否没有匹配的元素
boolean b2 = list.stream().noneMatch(i -> i > 200);
System.out.println(b2); //true
}
11.findFirst,findAny ----> 查找元素(终结方法)
查找第一个元素:findFirst,返回Optional类型
查找其中一个元素:findAny,返回Optional类型
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(124);
list.add(2);
list.add(15);
list.add(12);
list.add(51);
list.add(-5);
list.add(5);
// 输出第一个元素
Optional<Integer> first = list.stream().findFirst();
System.out.println(first); // 输出结果是Optional[124]
// 返回其中一个元素
Optional<Integer> any = list.stream().findAny();
System.out.println(any); // 输出结果是Optional[124]
}
12.collect(Collector c) -----> 收集(终结方法)
collect(Collector c):将流转化为其他形式,接收一个Collector接口的实现
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("张三",25));
list.add(new Person("李四",27));
list.add(new Person("王五",35));
list.add(new Person("赵六",55));
// 把年龄大于30岁的人,转成一个list集合
List<Person> collect = list.stream().filter(person -> person.getAge() > 30).collect(Collectors.toList());
// 遍历输出(输出王五和赵六)
for (Person person : collect) {
System.out.println(person.getName());
}
}
13.iterate ----> 迭代
public static void main(String[] args) {
Stream.iterate(0, n -> n + 1)
.limit(5)
.forEach(s -> System.out.println(s)); //打印 0 1 2 3 4
}