Java中的StreamAPI

1,什么是Stream

StreamJava8的一个新特性,它不是我们所知道的IOInputStream或者OutputStream,JavaStream的出现是

对于集合对象的功能增强,它提供了对集合对象进行各种非常方便,高效的操作.在处理大批量数据处理的时候使用

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 fifilter distinct sorted peek limit skip parallel sequential unordered
  • Terminal Stream 的终止操作m终端操作会从流的流水线生成结果,其结果可以是任何不是流的值 forEach forEachOrdered toArray reduce collect min max count anyMatch、allMatch、 noneMatch、fifindFirst fifindAny 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(1, 2, 3, 4);

List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());

//filter(Predicate p) 从流中过滤元素

Integer[] sixNums = {1, 2, 3, 4, 5, 6};

//经过条件被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" + 1, 10));

persons.add(new Person(2, "name" + 2, 21));

persons.add(new Person(3, "name" + 3, 34));

persons.add(new Person(4, "name" + 4, 6));

persons.add(new Person(5, "name" + 5, 55));

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表达式使用对性能的效果比原来更多了
  • 语法更加复杂,对初学者不友好
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值