美文网首页
8、Stream流式计算

8、Stream流式计算

作者: i小雨 | 来源:发表于2020-11-20 09:08 被阅读0次

什么是Stream流?

是数据的渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据,流讲的是计算!”

注意:
1、Stream不会存储元素。
2、Stream不会改变源对象。相反,它会返回一个持有结果的新stream
3、Stream操作是延迟执行的。这意味着它们会等到需要结果的时候才执行。

创建流的三个步骤:

  • 创建Stream:
    一个数据源(集合、数组),获取一个流。
  • 中间操作:
    一个中间操作链,对数据源的数据进行处理。
  • 终止操作:
    一个终止操作,执行中间操作链,并产生结果。

1、创建Stream:(5种方式)

public class TestStreamAPI {

    public static void main(String[] args) {

        User u1 = new User(1,"a",21);
        User u2 = new User(2,"b",22);
        User u3 = new User(3,"c",23);
        User u4 = new User(4,"d",24);
        User u5 = new User(6,"e",25);
        //集合就是存储数据
        List<User> list = Arrays.asList(u1,u2,u3,u4,u5);

        //创建Stream
        //1、通过Collection系列集合提供的stream()或者parallelStream()
        Stream<User> stream1 = list.stream();

        //2、通过Arrays中的静态方法stream()获取数组流
        Stream<User> stream2 = Arrays.stream(new User[10]);

        //3、通过Stream类中的静态方法of()
        Stream<String> stream3 = Stream.of("aa", "bb", "cc");

        //4、创建无限流
        //迭代
        Stream<Integer> stream4 = Stream.iterate(0, (x) -> x + 2);
        stream4.limit(10).forEach(System.out::println);
        //生成
        Stream.generate(() -> Math.random())
                .limit(4)
                .forEach(System.out::println);

    }
}

2、中间操作:

图片.png
图片.png
图片.png
图片.png
规约:reduce(T identity,BinaryOperator) 可以将流中的元素反复结合起来,得到一个值。
List<Integer> list1 = Arrays.asList(1,2,3,4,5);

Integer sum = list1.stream().reduce(0, (x, y) -> x + y);
System.out.println(sum); //sum = 15

收集:collect 将流转换成其他形式。接收一个collector接口的实现类,用于给Stream中元素做汇总的方法

User u1 = new User(1, "a", 21);
User u2 = new User(2, "b", 22);
User u3 = new User(3, "c", 23);
User u4 = new User(4, "d", 24);
User u5 = new User(6, "e", 25);
//集合就是存储数据
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);

List<String> collect = list.stream().map(User::getName).collect(Collectors.toList());
System.out.println(collect);
**************************************************
[a, b, c, d, e]

示例:User类自己创建

/**
 * 题目要求:用一行代码实现下列需求:
 * 有5个用户用下面条件筛选
 * 1、ID必须为偶数
 * 2、年龄必须大于23岁
 * 3、用户名转为大写
 * 4、用户名倒序
 * 5、只输出一个用户
 */
public class TestStream {

    public static void main(String[] args) {
        User u1 = new User(1,"a",21);
        User u2 = new User(2,"b",22);
        User u3 = new User(3,"c",23);
        User u4 = new User(4,"d",24);
        User u5 = new User(6,"e",25);
        //集合就是存储数据
        List<User> list = Arrays.asList(u1,u2,u3,u4,u5);

        //stream计算数据
        list.stream()
                .filter(user->{return user.getId()%2==0;})
                .filter(user->{return user.getAge()>23;})
                .map(user->{user.setName(user.getName().toUpperCase());
                return user;})
                .sorted((user1,user2)->{return user2.getName().compareTo(user1.getName());})
                .limit(1)
                .forEach(System.out::println);
    }
}
****************************结果:****************************
User{id=6, name='E', age=25}

相关文章

网友评论

      本文标题:8、Stream流式计算

      本文链接:https://www.haomeiwen.com/subject/iwyliktx.html