概念说明
流
在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端。在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
流的分类
根据数据流向的不同,可以分为输入流和输出流。
输入流:就是把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中。所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。
输出流:输出流就是把内存(程序)中的数据输出到外设或其他地方。所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。
根据处理单位的不同,可以分为字节流和字符流。
字节流:Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。
字符流:Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。
根据功能不同,可以分为节点流和处理流。
节点流:可以从一个特定的数据源(节点)读写数据,如文件,内存
处理流:是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能。
提供服务
过滤操作(Filter)
通过过滤操作可以从集合中筛选出满足指定条件的元素。例如,从一个整数集合中筛选出大于10的元素:
List<Integer> numbers = Arrays.asList(1, 5, 10, 15, 20); List<Integer> filteredNumbers = numbers.stream() .filter(n -> n > 10) .collect(Collectors.toList());
映射操作(Map)
通过映射操作可以将集合中的每个元素映射为另一个元素。例如,将一个字符串集合中的每个字符串转换为大写形式:
List<String> words = Arrays.asList("hello", "world", "java"); List<String> upperCaseWords = words.stream() .map(String::toUpperCase) .collect(Collectors.toList());
排序操作(Sorted)
通过排序操作可以对集合中的元素进行排序。例如,对一个整数集合进行升序排序:
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 10); List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList());
聚合操作(Reduce)
通过聚合操作可以将集合中的元素进行合并或计算。例如,计算一个整数集合的总和:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .reduce(0, Integer::sum);
收集操作(Collect)
通过收集操作可以将流中的元素收集到一个集合中。例如,将一个字符串流收集到一个字符串列表中:
Stream<String> stream = Stream.of("hello", "world", "java"); List<String> words = stream.collect(Collectors.toList());
总结
流是一个序列化的数据集合,它可以通过一系列的操作来进行转换和处理。
流的操作可以分为中间操作和终端操作。中间操作用于转换和处理数据,终端操作用于输出结果。
流的操作是惰性求值的,只有在终端操作被调用时才会执行。
流的操作可以链式调用,形成一个流水线,每个操作都会返回一个新的流,可以继续进行下一步操作。
升华
流提供了一种更简洁、更灵活的方式来处理集合数据,可以大大简化代码的编写,提高代码的可读性和可维护性。在实际开发中,根据具体的需求选择合适的流操作可以提高代码的效率和性能。