java入篇(35)Stream流

一、Stream流

1.1 Stream流概念

用来操作容器中(集合,数组中)元素的流。

1.2 创建Stream流

  • 需要一个数据源(集合,数组)来获取流:
  • 获取流有三种方法:
  • 集合中的Stream方法
  • Arrays中的Stream方法
  • Stream中的of方法
  • 获取一个无限流,
 //创建数据源:
        List<String> list = Arrays.asList("张", "大", "仙");
        //创建Stream流:
        //方式一 集合中的Stream方法
        Stream<String> stream = list.stream();
        //方式二 Arrays中的Stream方法
        Stream<String> stream1 = Arrays.stream(new String[]{"张", "大", "仙"});
        //方式三 Stream中的of方法
        Stream<String> stream2 = Stream.of("张", "大", "仙");

二、操作Stream流

2.1过滤与截断

  • Stream filter(Predicate<? super T> predicate)
    返回由与此给定谓词匹配的此流的元素组成的流。
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙");
        Stream<String> stream = list.stream();
        Stream<String> stream3 = stream.filter((str) -> {
            if (str.equals("张"))
                return true;
            else
                return false;
        });
        stream3.forEach(System.out::println);
    }
}
结果:
张
  • Stream distinct()
    返回由该流的不同元素(根据 Object.equals(Object) )组成的流。
    自定义的类需要重写equals()与hashCode()方法;
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙","张","^(* ̄(oo) ̄)^","头");
        Stream<String> stream = list.stream();
        stream.distinct().forEach(System.out::println);
    }
}

结果:
张
大
仙
^(* ̄(oo) ̄)^
头
  • Stream limit(long maxSize)
    返回由此流的元素组成的流,截短长度不能超过 maxSize 。
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙", "张", "大", "^(* ̄(oo) ̄)^");
        Stream<String> stream = list.stream();
        stream.limit(3).forEach(System.out::println);
    }
}

  • Stream skip(long n)
    跳过前n个元素
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙", "张", "大", "^(* ̄(oo) ̄)^");
        Stream<String> stream = list.stream();
        stream.skip(3).forEach(System.out::println);
    }
}

结果:
张
大
^(* ̄(oo) ̄)^
  • void forEach(Consumer<? super T> action)
    类似于遍历元素的功能
  • Stream map(Function<? super T,? extends R> mapper)
    对流中原有元素进行操作,将操作后得到的新的元素替换流中原来元素;
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙","张","^(* ̄(oo) ̄)^","头");
        Stream<String> stream = list.stream();
        stream.map((str)->str.concat("嘤嘤嘤")).forEach(System.out::println);
    }
}

结果:
张嘤嘤嘤
大嘤嘤嘤
仙嘤嘤嘤
张嘤嘤嘤
^(* ̄(oo) ̄)^嘤嘤嘤
头嘤嘤嘤
  • Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
    对流中原有元素进行操作,将得到的每个新的元素以流的形式返回,最终得到一条流;
public class Text {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("张", "大", "仙","张","^(* ̄(oo) ̄)^","头");
        Stream<String> stream = list.stream();
        stream.flatMap(new Function<String, Stream<?>>() {
            @Override
            public Stream<?> apply(String s) {
                Stream<String> stream1 = Arrays.asList(s, "猪", "牛", "羊").stream();
                return stream1;
            }
        }).forEach(System.out::print);
    }
}
结果:
张猪牛羊大猪牛羊仙猪牛羊张猪牛羊^(* ̄(oo) ̄)^猪牛羊头猪牛羊

2.2 排序

  • Stream sorted()
    返回由此流的元素组成的流,根据自然顺序排序。
public class Text {
    public static void main(String[] args) {
       Arrays.asList("go","asd","sds","xcv").stream().sorted().forEach(System.out::println);
    }
}

结果:
asd
go
sds
xcv
  • Stream sorted(Comparator<? super T> comparator)
    返回由该流的元素组成的流,根据提供的 Comparator进行排序。
public class Text {
    public static void main(String[] args) {
        Stream<Integer> stream = Arrays.asList(1,3,7,4).stream();
        stream.sorted((o1, o2)->o1-o2).forEach(System.out::println);
    }
}

结果:
1
3
4
7

2.3 查找与匹配

  • allMatch(Predicate p)
    检查是否匹配所有元素 比如判断 所有员工的年龄都是17岁 如果有一个不是, 就返回false
  • anyMatch(Predicate p)
    检查是否至少匹配一个元素 比如判断是否有姓王的员工, 如果至少有一个就返回true
  • noneMatch(Predicate p)
    检查是否没有匹配所有元素 比如判断所有员工的工资都是否都是高于3000 如果有一个人低于3000 就返回false
  • findFirst()
    返回第一个元素 比如获取工资最高的人 或者 获取工资最高的值是
  • findAny()
    返回当前流中的任意元素 比如随便获取一个姓王的员工
  • count()
    返回流中元素总数
  • max(Comparator c)
    返回流中最大值 比如:获取最大年龄值
  • min(Comparator c)
    返回流中最小值 比如:获取最小年龄的值
  • forEach(Consumer c)
    内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代

2.4 规约

  • reduce(T iden, BinaryOperator b)
    参1 是起始值, 参2 二元运算 可以将流中元素反复结合起来,得到一个值。返回 T 比如:求集合中元素的累加总和
public class Text {
    public static void main(String[] args) {
        Stream<Integer> stream = Arrays.asList(1,3,7,4).stream();
        System.out.println(stream.reduce(3, (x1, x2) -> x1 + x2));
    }
}
结果:
18

注意:是起始值和流中的所有元素做运算。

  • reduce(BinaryOperator b)
    这个方法没有起始值 可以将流中元素反复结合起来,得到一个值。返回 Optional
public class Text {
    public static void main(String[] args) {
        Stream<Integer> stream = Arrays.asList(1,3,7,4).stream();
        System.out.println(stream.reduce((x1, x2) -> x1 + x2));
    }
}

结果:
Optional[15]

2.5 收集

  • <R,A> R collect(Collector<? super T,A,R> collector)
    使用 Collector对此流的元素执行 mutable reduction Collector 。
public class Text {
    public static void main(String[] args) {
        Stream<Student> stream = Arrays.asList(new Student("猪猪侠", "19"),
                new Student("水桥舞", "10"),
                new Student("慢羊羊", "28")).stream();
        Stream<String> stream1 = stream.map((student) -> student.name);
        Set<String> collect = stream1.collect(Collectors.toSet());
        System.out.println(collect);
    }
}
结果:
[猪猪侠, 水桥舞, 慢羊羊]
  • R collect(Supplier supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
    对此流的元素执行 mutable reduction操作。

三、终止Stream流

Java–Stream流详解

四、实例操作

4.1 Integer list转字符串

//ArrayList<Integer> o1
 String collect = o1.stream().map(s->s+"").collect(Collectors.joining(""));

4.2 int数组转Integer list

List<Integer> collect = Arrays.stream(arr).boxed().collect(Collectors.toList());

4.3 list数组转int

int[] integers = collect.stream().mapToInt(Integer::valueOf).toArray();
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值