学习Java8的Stream
Java8引入了Stream,这是一个非常重要的新特性。Stream可以让你以一种独特的方式操作集合,同时还支持并行。它不仅可以更加方便的完成任务,而且还可以提高程序的效率。这篇文章将介绍一下Java8中的Stream以及如何使用它来操作集合。
什么是Stream?
Stream可以被看做是一种集合(List,Set等)的流式处理方式。它是在Java8中引入的一个全新的API,它的目的是为了让程序员更加方便的操作集合。Stream的设计是从单向链表的角度来看的,每一个Stream代表一个元素的序列,而这个序列中的每一个元素都是由上一个元素通过某种方式转化而来的。这样的设计可以让我们通过一系列的转换操作来关闭某一个元素的流水线,从而得到最终结果。
如何创建Stream?
在Java8中,我们可以使用Stream.of(集合)的方法来将集合转化为Stream。例如:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = Stream.of(list);
除了使用Stream.of()方式来创建Stream,我们还可以使用集合自带的stream()方式来创建流。例如:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = list.stream();
如何使用Stream?
Stream提供了一系列的操作符,在使用它们之前,我们首先要将集合转化为Stream。之后,我们可以使用filter()、map()、reduce()等操作符来对流进行处理。
1. filter()
filter()操作符会返回一个新的Stream,这个新的Stream只包含符合条件的元素。可以这样调用filter()操作符:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = list.stream(); List<Integer> newList = stream.filter(i -> i % 2 == 0).collect(Collectors.toList());
以上代码中,我们使用了filter()操作符来筛选出集合中的偶数,然后使用collect()操作符将结果转化为List。
2. map()
map()操作符会返回一个新的Stream,这个新的Stream中包含的元素是通过将原来的元素通过函数转化而来的。可以这样调用map()操作符:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = list.stream(); List<Integer> newList = stream.map(i -> i * i).collect(Collectors.toList());
以上代码中,我们使用了map()操作符将原来集合中的元素都平方,然后使用collect()操作符将结果转化为List。
3. reduce()
reduce()操作符可以将集合中的所有元素累计一起,例如求和、求积等等。可以这样调用reduce()操作符:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = list.stream(); int sum = stream.reduce(0, (a,b) -> a+b);
以上代码中,我们使用了reduce()操作符将集合中的所有元素相加,然后得到了一个数值结果。
如何使用并行流?
在Java8中,我们可以使用parallelStream()方法来将Stream转化为一个并行流。可以这样调用:
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Stream<Integer> stream = list.parallelStream();
并行流可以让我们在多核处理器的情况下更加高效的处理集合。
总之,Stream是一个非常强大的API,它可以让我们更加方便的操作集合,同时还支持并行处理。如果你还没有开始学习Java8,那么这篇文章应该给你一个很好的理由。
