Java中的StreamAPI

本文介绍了Java8的StreamAPI,它是一个集合增强功能,提供高效的数据处理方式。Stream不是数据结构,而是类似Iterator的高级版本,允许进行过滤、映射、排序等多种操作。文章详细讲解了如何创建流、流的操作方法,包括map、filter、reduce等,并通过实例展示了如何在实际编程中使用StreamAPI。

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

什么是Stream
Stream是Java8的一个新特性,它不是我们所知道的IO流InputStream或者OutputStream,在Java中Stream的出现是
对于集合对象的功能增强,它提供了对集合对象进行各种非常方便,高效的操作.在处理大批量数据处理的时候使用
StreamAPI能够极大的提高编程的效率和提高程序的可读性.

2,Stream的具体描述
Stream 不是集合元素,它不是数据结构并不保存数据,它更像一个高级版本的 Iterator。原始版本的 Iterator,用
户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执
行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍
历,做出相应的数据转换。
3,构造流的几种常见方法
//1.由值创建流
Stream stream = Stream.of("a""b""c");
//2.由数组创建流
String [] strArray = new String[] {"a""b""c"};
stream = Stream.of(strArray);
stream Arrays.stream(strArray);
//3.由Collection接口提供的流方法
ArrayList<String> list = new ArrayList<>();
stream list.stream();
4,流的操作方法种类
Intermediate Stream 的中间操作多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,
否则中间操作不会执行任何的处理。
map 、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
Terminal Stream 的终止操作m终端操作会从流的流水线生成结果,其结果可以是任何不是流的值
forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、
allMatch、 noneMatch、 findFirst、 findAny、 iterator
5,使用具体的案例
/*
map(Function f)接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素将数据转换为大

*/
ArrayList<String> list = new ArrayList<>();
list.add("abc");
list.add("test");
List<String> output = list.stream().map(String::toUpperCase).collect(Collectors.toList());

//将数据转成平方数
List<Integer> nums = Arrays.asList(1234);
List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());

//filter(Predicate p) 从流中过滤元素
Integer[] sixNums = {123, 456};
//经过条件被2整除,留下偶数,转成数组。
Integer[] evens =Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new);

//forEach内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。Stream API 使用内部迭代)
//对一个人员集合遍历,找出男性并打印姓名。
ArrayList<Person> nameList = new ArrayList<>();
nameList.add(new Person("张三",18));
nameList.add(new Person("李四",18));
nameList.stream().forEach(p -> System.out.println(p.getName()));

//limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
List<Person> persons = new ArrayList();
for (int i = 1; i <= 10000; i++) {
Person person = new Person(i, "name" + i);
persons.add(person);
}
List<String> personList2 = persons.stream().
map(Person::getName).limit(10).skip(3).collect(Collectors.toList());
System.out.println(personList2);

//对 Stream 的排序通过 sorted 进行,它比数组的排序更强之处在于你可以首先对 Stream 进行各类 map、
filter、limit、skip 甚至 distinct 来减少元素数量后,再排序,这能帮助程序明显缩短执行时间。
List<Person> persons = new ArrayList();
for (int i = 1; i <= 5; i++) {
Person person = new Person(i, "name" + i);
persons.add(person);
}
List<Person> personList2 persons.stream().limit(2).sorted((p1, p2) ->
p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
/*
MatchStream 有三个 match 方法,从语义上说:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true
*/


List<Person> persons = new ArrayList();
persons.add(new Person(1"name" + 110));
persons.add(new Person(2"name" + 221));
persons.add(new Person(3"name" + 334));
persons.add(new Person(4"name" + 46));
persons.add(new Person(5"name" + 555));

boolean isAllAdult = persons.stream().allMatch(p -> p.getAge() 18);
System.out.println("All are adult? " + isAllAdult);

boolean isThereAnyChild persons.stream().anyMatch(p -> p.getAge() < 12);
System.out.println("Any child? " + isThereAnyChild);

6,总结
Stream的优点
内部迭代减少了循环代码的编写
提供了各种数据处理的方法与接口
结合lambda表达式将代码进一步优化缩减
Stream的缺点
lambda表达式使用对性能的效果比原来更多了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值