1. 什么是流:
在 Java 中,流是一种用于处理集合数据的高级抽象。它允许你以声明性的方式操作集合,而不是使用传统的迭代方式。流操作可以串行执行,也可以并行执行,这使得它们非常适用于大数据集和并发环境。
2. 流的特点:
- 不是数据结构: 流不会保存数据,它只是在数据源上执行操作。
- 惰性执行: 流操作不会立即执行,只有在终端操作(如 forEach、collect)调用时才会执行。
- 可消费性: 流只能被消费一次,消费后就无法再次使用。
3. 流的创建:
可以从集合、数组、I/O 操作等地方创建流。
3.1 从集合创建流:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamCreationExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("apple", "banana", "orange");
// 从集合创建流
Stream<String> streamFromList = list.stream();
}
}
3.2 从数组创建流:
import java.util.Arrays;
import java.util.stream.IntStream;
public class StreamCreationExample {
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
// 从数组创建 IntStream
IntStream streamFromArray = Arrays.stream(array);
}
}
4. 流的中间操作:
中间操作返回一个新的流,允许你在数据上进行一些转换和过滤。
4.1 过滤:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamIntermediateOperations {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");
// 过滤长度大于 5 的水果
List<String> filteredFruits = fruits.stream()
.filter(fruit -> fruit.length() > 5)
.collect(Collectors.toList());
System.out.println(filteredFruits);
}
}
4.2 映射:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamIntermediateOperations {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange");
// 将水果名转为大写
List<String> uppercasedFruits = fruits.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(uppercasedFruits);
}
}
5. 流的终端操作:
终端操作触发流的执行,并产生一个最终结果。
5.1 forEach:
import java.util.Arrays;
import java.util.List;
public class StreamTerminalOperations {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange");
// 打印每个水果
fruits.stream()
.forEach(System.out::println);
}
}
5.2 collect:
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamTerminalOperations {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange");
// 将水果收集到一个新的列表中
List<String> collectedFruits = fruits.stream()
.collect(Collectors.toList());
System.out.println(collectedFruits);
}
}
6. 并行流:
流支持并行处理,可以提高在多核处理器上的性能。
import java.util.Arrays;
import java.util.List;
public class ParallelStreamExample {
public static void main(String[] args) {
List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");
// 使用并行流过滤长度大于 5 的水果
List<String> filteredFruits = fruits.parallelStream()
.filter(fruit -> fruit.length() > 5)
.collect(Collectors.toList());
System.out.println(filteredFruits);
}
}
7. 常用操作:
除了上述操作外,流还支持很多其他常用操作,如排序、去重、查找等。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class CommonOperationsExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 2, 4, 6, 8);
// 去重
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
// 排序
List<Integer> sortedNumbers = numbers.stream()
.sorted()
.collect(Collectors.toList());
// 查找第一个偶数
int firstEven = numbers.stream()
.filter(num -> num % 2 == 0)
.findFirst()
.orElse(-1);
System.out.println(distinctNumbers);
System.out.println(sortedNumbers);
System.out.println("First even number: " + firstEven);
}
}
以上是一个简单的 Java 流教程,介绍了流的基本概念和一些常用操作。流提供了一种更优雅和功能强大的方式来处理集合数据,适用于各种数据处理场景。
转载请注明出处:http://www.pingtaimeng.com/article/detail/463/Java