Stream

82 阅读2分钟

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));