1,什么是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(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表达式使用对性能的效果比原来更多了
语法更加复杂,对初学者不友好
|
|