Stream API 和 Lambda表达式
Java 8 Stream API
内容
- 操作类型:
- 中间操作:对流中的元素进行操作,如过滤(filter)、映射(map)、排序(sorted)、查找(findFirst)等。
- 终端操作:结束流操作,并产生结果,如收集(collect)、计数(count)、遍历(forEach)等。
- 流来源:
- 从集合、数组、I/O资源等创建流。
- 并行处理:
- 支持并行处理,可以高效地处理大数据集。
使用方法
- 创建流:
- 从集合创建流:List list = Arrays.asList("a", "b", "c"); Stream stream = list.stream();
- 从数组创建流:int[] numbers = {1, 2, 3}; Stream stream = Arrays.stream(numbers);
- 中间操作:
- 链式调用,如:stream.filter(s -> s.startsWith("a")).map(String::toUpperCase).forEach(System.out::println);
- 终端操作:
- 结束流操作,如:List result = stream.collect(Collectors.toList());
Lambda 表达式
内容
- 匿名函数:没有名称的函数,可以传递给方法。
- 单一方法接口:通常用于实现了单一抽象方法的接口。
使用方法
- 创建:
- 定义方法接口的匿名实现,如:Runnable runnable = () -> System.out.println("Hello, World!");
- 定义带参数的Lambda表达式,如:Comparator comparator = (s1, s2) -> s1.compareTo(s2);
- 简化代码:
- 代替匿名内部类,如:list.sort(comparator);(使用Lambda表达式)
- 而不是list.sort(new Comparator() { ... });(使用匿名内部类)
示例
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List names = Arrays.asList("Alice", "Bob", "Charlie");
// 使用Stream API和Lambda表达式
List upperCaseNames = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
upperCaseNames.forEach(System.out::println);
}
}
在这个示例中,使用Stream API和Lambda表达式来处理一个字符串列表,筛选出以"A"开头并转换为大写的字符串,并将结果收集到一个新的列表中。
(图片来源网络,侵删)
总结来说,Java 8 Stream API提供了一种新的数据处理方式,而Lambda表达式提供了一种新的代码表达方式。两者结合使用,可以写出更简洁、高效的代码。
中间操作和终端操作
在Java 8的Stream API中,中间操作和终端操作是两个关键概念,它们定义了流处理的不同阶段。
中间操作(Intermediate Operations)
中间操作是流处理的第一阶段。当你对流执行中间操作时,它不会立即执行这些操作,而是会返回一个新的流。这个新的流包含了原始流的所有元素,但会附带额外的信息,用于执行后续操作。
特点:
- 惰性执行:中间操作是惰性的,意味着它们不会立即执行,而是会生成一个新的流。
- 链式调用:你可以将多个中间操作链式调用,形成一个复杂的数据处理流程。
- 返回新的流:每个中间操作都会返回一个新的流。
示例:
List names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);
在这个例子中,filter和map都是中间操作。它们不会立即执行,而是生成一个新的流,这个流包含了所有以"A"开头并转换为大写的字符串。
终端操作(Terminal Operations)
终端操作是流处理的最终阶段。当你对流执行终端操作时,它会对流中的元素执行最终的计算,并产生一个结果。这个结果可以是任何类型的,比如一个列表、一个计数或者一个计算出的值。
特点:
- 执行并返回结果:终端操作会执行流处理流程,并返回一个结果。
- 结束流处理:一旦终端操作被执行,流处理流程就结束了。
示例:
List names = Arrays.asList("Alice", "Bob", "Charlie");
int count = names.stream()
.filter(name -> name.startsWith("A"))
.mapToInt(String::length)
.sum();
System.out.println("Number of letters: " + count);
在这个例子中,sum()是一个终端操作。它对流中的每个元素(这里是字符串的长度)执行求和操作,并返回结果。
总结
- 中间操作:对流进行处理但不立即执行,返回一个新的流。
- 终端操作:对流进行最终的处理并返回结果,结束流处理流程。
-
理解这两个概念对于正确使用Java 8 Stream API非常重要,因为它们定义了流处理的流程和顺序。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
