Java Stream API 是一个用于处理集合的 API,它允许以声明性方式处理数据。使用流,我们可以过滤、转换、聚合和排序数据,而无需编写大量的循环和条件语句。本文将教你如何使用 Java Stream API 让你的代码更加简洁和易于理解。
使用 Java Stream API,我们可以从集合、数组、文件等各种数据源创建一个流。我们可以使用 Stream
类的静态方法来创建一个流。以下是一些示例:
// 从 List 创建流
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
// 从 Set 创建流
Set<String> names = new HashSet<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
Stream<String> stream = names.stream();
// 从 int 数组创建流
int[] intArray = {1, 2, 3, 4};
IntStream stream = Arrays.stream(intArray);
// 从 String 数组创建流
String[] stringArray = {"apple", "orange", "banana"};
Stream<String> stream = Arrays.stream(stringArray);
try {
// 从文件创建流
Stream<String> stream = Files.lines(Paths.get("data.txt"));
} catch (IOException e) {
e.printStackTrace();
}
Java Stream API 中间操作可以在流的元素上进行处理操作,但不返回数据。下面是一些常用的中间操作:
筛选元素,只保留符合条件的元素。
Stream<String> stream = Arrays.stream(stringArray);
Stream<String> filteredStream = stream.filter(s -> s.length() > 5);
filteredStream.forEach(System.out::println);
输出结果: orange banana
将元素转换为另外一个元素。
Stream<String> stream = Arrays.stream(stringArray);
Stream<Integer> lengthStream = stream.map(String::length);
lengthStream.forEach(System.out::println);
输出结果: 5 6 6
对元素进行排序操作。
Stream<String> stream = Arrays.stream(stringArray);
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println);
输出结果: apple banana orange
终端操作是在流上执行最终操作的操作。终端操作可能生成结果或副作用。当调用结束操作时,流将被关闭。以下是一些常用的终端操作:
迭代并打印流中的元素。
Stream<String> stream = Arrays.stream(stringArray);
stream.forEach(System.out::println);
输出结果: apple orange banana
转换流中的元素,并将其收集到集合中。
Stream<String> stream = Arrays.stream(stringArray);
List<String> list = stream.collect(Collectors.toList());
返回流中的元素数。
Stream<String> stream = Arrays.stream(stringArray);
long count = stream.count();
System.out.println(count);
输出结果: 3
这是一些常见的流操作,你可以根据自己的需要选择不同的操作来处理流。使用 Java Stream API,可以将代码变得更加简洁和易于理解。
以下是一个使用 Stream API 和 Lambda 表达式,实现计算列表中所有奇数的平方和。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream()
.filter(i -> i % 2 != 0) // 过滤奇数元素
.mapToInt(i -> i * i) // 平方每个元素
.sum(); // 对所有元素求和
System.out.println(sum); // 输出结果:35
以下是一个使用 Stream API 和 Lambda 表达式,筛选某个目录下的所有文件名以 ".txt" 结尾的文件名。
try {
Stream<Path> stream = Files.list(Paths.get("C:/data"));
stream.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".txt"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
本文链接:http://task.lmcjl.com/news/13051.html