Stream流式计算

举报
多米诺的古牌 发表于 2021/09/27 17:37:32 2021/09/27
【摘要】 1.Stream流Stream流式计算的相关方法都位于java.util.stream包下,一般我们使用集合进行数据的存储,使用流进行计算,而如何将集合转换成数组呢?只需要使用集合.stream()方法将集合中的数据转换成流对象。2.流式计算常用方法2.1 stream()将集合中的数据全部转换为流对象;default Stream<E> stream() { return Strea...

1.Stream流

Stream流式计算的相关方法都位于java.util.stream包下,一般我们使用集合进行数据的存储,使用流进行计算,而如何将集合转换成数组呢?只需要使用集合.stream()方法将集合中的数据转换成流对象。

2.流式计算常用方法

2.1 stream()将集合中的数据全部转换为流对象;

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

2.2 Stream<T> filter(Predicate<? super T> predicate)方法

用于过滤数据,我们从参数列表可以看出,参数是断定型函数式接口可以使用lambda表达式进行优化,因为Predicate断定式函数型接口只有入参,返回值是一个布尔值,所以可以简化为集合.filter(参数->{return 一般加相关业务的判断来进行筛选,返回值需要是布尔类型}),举个栗子:筛选出集合中id为1的数据,即:list.stream().filter(u->u.getId()==1);(优化前是list.stream().filter((u)->{return u.getId()==1;});)

Stream<T> filter(Predicate<? super T> predicate);

2.3 void forEach(Consumer<? super T> action)方法

用于遍历集合,我们从参数列表可以看出,参数是断定型函数接口可以使用lambda表达式进行优化,因为Consumer消费者型函数式接口只有入参,并且没有返回值,所以可以简化为集合.forEach(参数->{相关业务代码}),举个栗子:遍历出集合中的所有元素的名字list.stream().forEach(u->{ u.getName();});或者单独一个对象打印方法list.stream().forEach(System.out::println);

void forEach(Consumer<? super T> action);

2.4 <R> Stream<R> map(Function<? super T, ? extends R> mapper)方法

因为map方法主要是用于映射,所以需要传入一个映射的值,再瞅瞅map方法的参数,我们发现是一个Function函数式接口,有一个入参和一个返回值,所以可以简化为集合.map(参数->{return 相关业务代码}),举个例子:打印出集合中所有对象的年龄list.stream().map(u->u.getAge()).forEach(System.out::println);

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

2.5 Stream<T> sorted(Comparator<? super T> comparator)方法

用于排序,其中Comparator也是一个用于排序的函数式接口,需要配合map方法进行使用,只用到了一个排序方法所以可以使用lambda表达式进行优化,格式为集合.sorted((u1,u2)->{return u1.compareTo(u2);})或者使用无参的方法,集合.sorted()进行正序排列,集合.sorted((u1,u2)->{return u2.compareTo(u1);})进行倒序排列,举个例子:打印出集合中的所有年龄并且按照倒序排序,即list.stream().map(u -> u.getAge()).sorted((u1,u2)->{return u2.compareTo(u1);}).forEach(System.out::println);下图为Compartor排序的函数式接口:

public interface Comparator<T> {
    int compare(T o1, T o2);

下面是sorted排序方法的一种是无参的正序排列方法,一种是有参可以自定义排序的排序方法;

Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);

2.6 Stream<T> limit(long maxSize)方法

是用于截取最大个数的方法,只有一个入参(最大个数),对集合按照自定义的个数进行截取,格式为:集合.limit(最大个数),举个例子:打印出集合中两个数据的年龄,即:list.stream().map(u -> u.getAge()).limit(2).forEach(System.out::println);

Stream<T> limit(long maxSize);

 3.综合使用上述常用流式计算的小案例(使用链式编程)

案例:创建6个用户满足:1.筛选出id为偶数;2.年龄大于23;3.获取用户名称并转换为大写;4.进行倒序排列;5.打印出年龄最大的用户。

根据下面的代码我们可以总结出stream流式计算(链式编程)的优点会使执行的效率提高,代码变得简捷,看起来更加优雅等。

User user1 = new User(1, "name1", 21);
User user2 = new User(2, "name2", 22);
User user3 = new User(3, "name3", 23);
User user4 = new User(4, "name4", 24);
User user5 = new User(5, "name5", 25);
User user6 = new User(6, "name6", 26);
List<User> list = Arrays.asList(user1,user2,user3,user4,user5,user6);

list.stream()
        .filter(u -> u.getId()%2 == 0)
        .filter(u -> u.getAge() >= 23)
        .map(u -> u.getName().toUpperCase())
        .sorted((u1,u2) -> {return u2.compareTo(u2);})
        .limit(1)
        .forEach(System.out::println);
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。