StreamAPI基础知识

3/8/2017来源:ASP.NET技巧人气:1664

Stream的概念 Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate Operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。

特点:

无存储(数据都是来自数据源) 可表示无限元素(集合都是有限元素) 内部迭代 支持并行处理 支持函数式编程 支持有序或无序

Stream的简单用法 1.获取该数组内偶数之和

public static void main(String[] args) { // 新建一个数组 List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5); // 利用stream获取该数组内偶数之和 int a = nums.stream().filter(n -> n % 2 == 0).reduce(Integer::sum).get(); }

创建Stream实例

/** * 1.从值创建stream */ Stream<String> s1 = Stream.of("Tom", "Jim", "Jone"); Stream<String> s2 = Stream.<String> builder().add("Tom").add("Jim").build(); // 1~9的整数Stream IntStream is = IntStream.range(1, 10); // 1~10的整数Stream IntStream is1 = IntStream.rangeClosed(1, 10); /** * 2.空Stream */ Stream<String> s3 = Stream.empty(); /** * 3.通过函数创建Stream */ //iterate Stream<Long> l1 = Stream.iterate(1L, n->n+1); l1.limit(10); //generate Stream.generate(Math::random).limit(5).forEach(System.out::PRintln); /** * 4.Arrays数组产生Stream */ Arrays.stream(new int[]{1,2,3,4,5}); Arrays.stream(new String[]{"1","2"}); // chars方法建立Stream "aaabb".chars();// 输出结果:97,97,97,98,98 // splitAsStream建立Stream Pattern.compile(",").splitAsStream("asdf,bbb,vvv"); // 输出结果:asdf bbb vvv

Stream方法

peek(),forEach(),Map(),filter(),distinct(),limit(),skip(),sorted(),reduce() - peek:是输出流的结果,一般只是作为调试使用。 - forEach:只要是用于循环Stream流的内容,参数可以是lambda表达式或者方法引用。 - Map:返回对元素进行运算之后结果的流,是一对一的。 - filter:Stream的过滤条件。filter(Predicate<? super T> predicate),predicate返回的是boolean值。 - distinct:去除流中的重复元素。 - limit:限制Stream流中的数量。 - ship:丢弃Stream中前面一定数量的元素 - sorted:对Stream中的元素进行排序。要求元素类型是可排序的。或者传入compartor参数。 - reduce:最终类型,后面不能再调用其他方法。 - reduce(BinaryOperator<T> accumulator) BinaryOperator:运算方式。返回的是Optional<T> - reduce(T identity, BinaryOperator<T> accumulator) identity:初始值 - reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)用于并行处理

在Stream上进行数据收集操作 Stream可以通过collect方法可以讲类型改为List,Map,Set类型。

collect(Supplier supplier, BiConsumer(R,? super T) accumulator, BiConsumer(R,R) combiner) List<String> names = Person.persons().stream().map(Person::getName).collect(ArrayList::new, ArrayList::add,ArrayList::addAll); collect(Collector collector) List<String> names2 = Person.persons().stream().map(Person::getName).collect(Collectors.toList());

Collectors中也有许多方法可以对获取的Stream元素进行分组,求和等操作

利用groupingBy方法进行元素分组 Map<Gender, List<Person>> r = Person.persons().stream().collect(Collectors.groupingBy(Person::getGender));

Stream中并行和串行的相互切换 并行能够提升性能,默认建立的Stream都是串行的,串行Stream改为并行是用parallelStream,并行改串行是sequential

ist<String> names = Person.persons().parallelStream().sequential();