Java 8 API添加了一个新的抽象称为流Stream,stream是用于对集合迭代器的增强,使之能够更高效的完成聚合操作(筛选、排序、统计分组)或者大批量数据操作。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
1、Stream有几个特性:
2、Stream可以由数组或集合创建,对流的操作分为两种:
3、在 Java 8 中, 集合接口有两个方法来生成流:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
int[] array = {1, 2, 3, 4, 5, 6};
IntStream stream = Arrays.stream(array);
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Stream<Integer> stream = Stream.iterate(0, (x) -> x + 3).limit(3);
Stream<Double> stream = Stream.generate(Math::random).limit(3);
筛选,是按照一定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。
(1)筛选出集合中大于5的元素,并形成新的集合,打印出来。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
list.stream().filter(x -> x > 5).collect(Collectors.toList()).forEach(System.out::println);
(1)获取String集合中最长的元素
List<String> list = Arrays.asList("Java", "Python", "C++", "C", "PHP");
Optional<String> max = list.stream().max(Comparator.comparing(String::length));
System.out.println("最长的字符串:" + max.get());
说明: Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
(2)获取Integer集合中的最小值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional<Integer> min = list.stream().min(Integer::compareTo);
System.out.println("自然排序的最小值:" + min.get());
(3)计算Integer集合中大于等于5的元素的个数
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
long count = list.stream().filter(x -> x > 5).count();
System.out.println("list中大于5的元素个数:" + count);
(1)英文字符串数组的元素全部改为大写
String[] strArr = {"Java", "Python", "C++", "C", "PHP"};
Arrays.stream(strArr).map(String::toUpperCase).collect(Collectors.toList()).forEach(System.out::println);
(2)将两个字符数组合并成一个新的字符数组
List<String> list = Arrays.asList("1,3,5,7,9", "2,4,6,8,10");
List<String> listNew = list.stream().flatMap(s -> {
// 将每个元素转换成一个stream
String[] split = s.split(",");
Stream<String> s2 = Arrays.stream(split);
return s2;
}).collect(Collectors.toList());
listNew.forEach(System.out::println);
归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。 (1)求Integer集合的元素之和的三种方式
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional<Integer> sum = list.stream().reduce((x, y) -> x + y); //方式1
Optional<Integer> sum2 = list.stream().reduce(Integer::sum); //方式2
Integer sum3 = list.stream().reduce(0, Integer::sum); //方式3
System.out.println("list求和:" + sum.get() + "," + sum2.get() + "," + sum3);
(2)求Integer集合的乘积和最大值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional<Integer> product = list.stream().reduce((x, y) -> x * y);
System.out.println("list求积:" + product.get());
(3)求Integer集合的最大值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y); // 方式1
Integer max2 = list.stream().reduce(1, Integer::max); // 方式2
System.out.println("list求和:" + max.get() + "," + max2);
sorted 方法用于对流进行排序。
List<Integer> list = Arrays.asList(1, 3, 5, 2, 4, 6);
list.stream().sorted().forEach(System.out::println);
倒排序
String[] strArr = {"Java", "Python", "C++", "C", "PHP"};
Arrays.stream(strArr).sorted(Comparator.comparing(String::length).reversed()).forEach(System.out::println);