Java——Stream流

本文介绍了Java 8中Stream流的概念,通过实例展示了如何利用Stream进行集合操作,包括过滤、限制、转换等。重点讲解了Stream流的思想、获取方法以及常用API,强调其作为操作集合工具的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Stream流


stream流的概述


  • 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。

  • 目的:用于简化集合和数组操作的[[API]]

  • 案例:体验Stream流的作用

//体验Stream流的作用  
import java.util.ArrayList;  
import java.util.List;  
import java.util.function.Predicate;  
import java.util.stream.Collectors;  
import java.util.stream.Stream;  
  
public class Demo01 {  
    public static void main(String[] args) {  
        //1.创建一个集合,存储多个字符串元素  
        List<String> list1 = new ArrayList<>();  
        list1.add("张三丰");  
        list1.add("张无忌");  
        list1.add("周芷若");  
        list1.add("赵敏");  
        list1.add("张强");  
  
        //2.把集合中所有以"张"开头的元素存储到一个新的集合  
        ArrayList<String> zhanglist1 = new ArrayList<>();  
        for (int i = 0;i<list1.size();i++) {  
            String s = list1.get(i);  
            if (s.startsWith("张")) {  
                zhanglist1.add(s);  
            }  
        }  
        System.out.println(zhanglist1);  
  
        //3.把"张"开头的集合中的长度为3的元素存储到一个新的集合  
        ArrayList<String> zhanglist2 = new ArrayList<>();  
        for (int i = 0;i<zhanglist1.size();i++) {  
            String s = zhanglist1.get(i);  
            if (s.length()==3) {  
                zhanglist2.add(s);  
            }  
        }  
        System.out.println(zhanglist2);  
  
        //4.遍历上一步得到的集合中的元素输出。  
        for (String zhanglist3:zhanglist2) {  
            System.out.println(zhanglist3);  
        }  
  
        System.out.println("================================");  
  
        //使用stream流来进行上述要求操作  
        //1.匿名内部类 
        /*Stream<String> stream = list1.stream();  
        Stream<String> zhangStream = stream.filter(new Predicate<String>() {            @Override            public boolean test(String s) {                if (s.startsWith("张")) {  
                    return true;                }                return false;            }        });        List<String> collect = zhangStream.collect(Collectors.toList());        System.out.println(collect);*/  
        //2.[[lambda表达式]]  
        List<String> coll = list1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).collect(Collectors.toList());  
        System.out.println(coll);  
  
    }  
}
  • Stream流的思想
    • 先得到集合或者数组的Stream流(就是一根传送带)
    • 把元素放上去
    • 然后就用这个Stream流简化的API来方便的操作元素。

Stream流的获取


  • Stream流的三类方法:
    • 获取Stream流
      • 创建一条流水线,并把数据放到流水线上准备进行操作
    • 中间方法
      • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
    • 终结方法
      • 一个Stream流只能有一个终结方法,是流水线上的最后一个操作

在这里插入图片描述

Stream流的常用API


名称说明
Stream<T> filter(Predicate<? super T> predicate)用于对流中的数据进行过滤
Stream<T> limit(long maxSize)获取前几个元素
Stream<T> skip(long n)跳过前几个元素
Stream<T> distinct()去除流中重复的元素。依赖(hashCode和equals方法)
static <T> Stream<T> concat(Stream a, Stream b)合并a和b两个流为一个流
import com.zhou.day0906.Dog;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.stream.Stream;  
  
public class Demo03 {  
    public static void main(String[] args) {  
        List<Dog> dogs = new ArrayList<>();  
        dogs.add(new Dog("哈士奇",1));  
        dogs.add(new Dog("哈士奇",1));  
        dogs.add(new Dog("哈士奇",3));  
        dogs.add(new Dog("柯基",4));  
        Stream<Dog> stream1 = dogs.stream().distinct();  
        Stream<Dog> stream2 = dogs.stream().filter((a) -> {  
            return a.getAge() > 2;  
        });  
        Stream.concat(stream1,stream2).forEach((a)->{  
            System.out.println(a);  
        });  
    }  
}
  • 中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。

  • 在Stream流中无法直接修改集合、数组中的数据。

  • Stream流的常见终结操作方法
    |名称|说明|
    |–|–|
    |void forEach(Consumer action)|对此流的每个元素执行遍历操作|
    |long count()|返回此流中的元素数|

  • 注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

收集Stream流


  • 收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。

  • Stream流:方便操作集合/数组的手段。

  • 集合/数组:才是开发中的目的。

在这里插入图片描述

  • Stream流是操作集合/数组的手段
  • 操作的结果数据最终要恢复到集合或者数组中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值