Java基础——stream

stream是什么?

stream可以简化对集合的操作,具体操作由流内部实现,而无需用户自行实现过程

stream优点

对于以下ArrayList

List<String> words = new ArrayList<>();
words.add("tom");
words.add("john");

如果我们要统计其长度大于4的字符串,需要循环进行遍历

int count = 0;
for (String s : words) {
    if (s.length() >= 4) {
        count++;
    }
}

而使用stream,无需遍历和计数,只需要指定做什么,而无需关注怎么做

long count = words.stream().filter(s -> s.length() >=4).count();

stream和集合的区别

  • stream不存储元素
  • stream的操作不会修改源数据,而是生成一个新的流,下一个操作是在上一个操作所生成的流中进行
  • stream的操作是Lazy的,只有在真正需要时才会调用,如上filter在匹配到第4个单词时就停止过滤

stream的创建

对于任何实现类Collection的子类,都可通过stream()方法获取流

List<String> list= new ArrayList<>();
Stream<String> stream = list.stream();

对于个别元素,可用Stream.of()构建

Stream<String> stream = Stream.of("tom", "john");

对于数组,可用Arrays.stream()构建

String[] strings=new String[]{"tom","john"};
Stream<String> stream = Arrays.stream(strings);

构建空的stream,可通过泛型指定其元素类型

Stream<Object> stream = Stream.empty();

使用generage生成无限stream,如生成随机数流

Stream<Double> stream = Stream.generate(Math::random);

steam的操作

filter()可指定流的过滤条件,如将长度大于3的元素筛选出来

List<String> list = new ArrayList<>();
Stream<String> stringStream = list.stream().filter(s -> s.length() > 3);

map()可指定流的转换条件,如将单词转为小写

Stream<String> stringStream = list.stream().map(s -> s.toLowerCase());

limit()可截取流,如生成10个随机数流

Stream<Double> stream = Stream.generate(Math::random).limit(10);

distinct()可去除流中的重复元素

Stream<String> stream = list.stream().distinct();

sort()可对流进行排序,可调用默认比较器或自行定义比较器

Stream<String> sort1 = list.stream().sorted();
Stream<String> sort2 = list.stream().sorted(Comparator.comparing(String::length).reversed());

从steam中取值

以下从数组的stream中取出最大值,

OptionalInt max = Arrays.stream(new int[]{1, 2, 3}).max();
int i = max.orElse(0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 8中新增的Stream是一种处理集合的优雅姿势。 Stream是对集合(Collection)对象功能的增强,它能以一种声明的方式来处理数据,实现类似于SQL语句的操作。Stream不会改变原有的数据结构,它会生成一个新的Stream,同时支持并行化操作。 Stream的核心思想是将数据看作是流,而流上可以进行各种操作,比如过滤、排序、映射等。这样可以将数据处理过程变得非常简洁和灵活。 下面是一些Stream的常用操作: 1. filter:过滤符合条件的元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().filter(i -> i % 2 == 0).forEach(System.out::println); //输出2, 4 ``` 2. map:将元素转换成另一种类型 ``` List<String> list = Arrays.asList("apple", "banana", "orange"); list.stream().map(s -> s.toUpperCase()).forEach(System.out::println); //输出APPLE, BANANA, ORANGE ``` 3. sorted:对元素进行排序 ``` List<Integer> list = Arrays.asList(5, 2, 1, 4, 3); list.stream().sorted().forEach(System.out::println); //输出1, 2, 3, 4, 5 ``` 4. distinct:去重 ``` List<Integer> list = Arrays.asList(1, 2, 3, 2, 1); list.stream().distinct().forEach(System.out::println); //输出1, 2, 3 ``` 5. limit:限制元素个数 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().limit(3).forEach(System.out::println); //输出1, 2, 3 ``` 6. skip:跳过元素 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); list.stream().skip(2).forEach(System.out::println); //输出3, 4, 5 ``` 7. reduce:对元素进行聚合操作 ``` List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); //输出15 ``` Stream的操作可以组合起来形成一个流水线,每个操作都会返回一个新的Stream对象,这样就可以形成一个操作序列。最后调用终止操作(如forEach、findAny等)才会触发所有中间操作的执行。 使用Stream处理集合的代码通常比使用传统的循环更简洁,同时也更易于并行化处理,提高了程序的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值