Stream流的中间操作
概念
中间操作(Intermediate Operations):中间操作会返回一个新的流,一个流可以后面跟随零个或多个intermediate操作。其目的主要是打开流,做出某种程度的数据映射/过滤,然后会返回一个新的流,交给下一个操作使用。这类操作都是惰性化的(lazy),就是说,仅仅调用到这类方法,并没有真正开始流的遍历。而是在终端操作开始的时候才真正开始执行。
| 名称 | 说明 |
|---|---|
| Stream filter(Predicate<? Super T> predicate) | 过滤 |
| Stream limit (long maxSize) | 获取前几个指定数量元素 |
| Stream skip (long maxSize) | 跳过前几个指定数量元素 |
| Stream distinct() | 元素去重 依赖(hashCode和equals) |
| static Stream concat(Stream a,Stream B) | 将a和b两个流合并为一个 |
| Stream map (Function<T,R> mapper) | 转换流中的数据类型 |
注:
- 中间方法,返回新的Stream流,原来的Stream只能使用一次,建议使用链式编程
- 修改stream中的数据,不会影响原来集合或者数组中的数据
代码演示
filter | limit | skip
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"张三丰","张无忌","张翠山","王二麻子","张良","谢广坤");
// filter 过滤
list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.startsWith("张");
}
}).forEach(s -> System.out.println(s));
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
System.out.println("=============================");
// 获取指定数量的元素
list.stream().limit(3).forEach(s-> System.out.println(s));
System.out.println("==============================");
// 跳过指定数量的元素
list.stream().skip(4).forEach(s-> System.out.println(s));
distinct | concat
// 初始化集合
ArrayList<String> list = new ArrayList<>();
// 批量添加数据
Collections.addAll(list,"张三丰","张三丰","张三丰","张三丰","张三丰","张无忌","张翠山","王二麻子","张良","谢广坤");
ArrayList<String> list1 = new ArrayList<>();
list1.add("huawei");
list1.add("xiaomi");
// 数据去重
list.stream().distinct().forEach(s-> System.out.println(s));
System.out.println("==================================================");
// 合并
Stream.concat(list.stream(),list1.stream()).forEach(s-> System.out.println(s));
map
// 初始化集合
ArrayList<String> list = new ArrayList<>();
// 批量添加数据
Collections.addAll(list,"阿三-18","鹰酱-19","大毛-21");
list.stream().map(new Function<String, Object>() {
@Override
public Object apply(String s) {
String[] as = s.split("-");
String age = as[1];
int ages = Integer.parseInt(age);
return ages;
}
}).forEach(s-> System.out.println(s));
// 链式编程
list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));