本文共 3214 字,大约阅读时间需要 10 分钟。
java8中,除了Lambda表达式之外,还提供了强大的Stream API(java.util.stream.*),即流式编程。那什么是流式编程?
什么是流式编程 |
Stream是Java8中处理集合的关键抽象概念,它可以指定你想对集合进行的操作,比如:进行非复杂的查询、过滤、或者映射数据等一系列的操作。Stream不是集合元素,也不是数据结构,它相当于一个高级版本的遍历器(Iterator),不能够重复遍历里面的数据,就像是流水一样,流过就不再复返了。与普通的Iterator不同的是,普通的Iterator只能是串行,而Stream可以并行操作,这样就大大提高了我们的操作速度。
注意:
1)Stream自己不会存储元素
2)Stream的相关操作不会改变数据源。相反地他们会返回一个含有操作结果的新的Stream
Stream操作三步曲 |
1)创建 Stream
一个数据源(如:集合、数组),获取一个Stream流
方法 | 描述 |
---|---|
stream() | 获取串行流 |
parallelStream() | 获取并行流 |
2)中间操作
在流的传输过程中,对Stream流进行处理
查询
方法 | 描述 |
---|---|
allMatch(Predicate p) | 检查是否匹配所有元素 |
anyMatch(Predicate p) | 检查是否至少匹配一个元素 |
noneMatch(Predicate p) | 检查是否没有匹配所有元素 |
findFirst() | 返回第一个元素 |
findAny() | 返回当前流中的任意元素 |
筛选与切片
方法 | 描述 |
---|---|
distinct() | 筛选,通过流所生成的元素的hashCode()和equals()去除重复的元素(要去重的实体类需要重写hashCode和equals方法) |
limit(long maxSize) | 截断流,使其元素不超过给定数量 |
filter(Predicate p) | 接收Lambda,从流中排除掉某些元素 |
skip(long n) | 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补 |
映射
方法 | 描述 |
---|---|
map(Function f) | 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素 |
mapToInt(ToIntFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream |
mapToLong(ToLongFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream |
mapToDouble(ToDoubleFunction f) | 接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream |
flatMap(Function f) | 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连成一个流 |
排序
方法 | 描述 |
---|---|
sorted() | 产生一个新流,其中按自然顺序排序 |
sorted(Comparator comp) | 产生一个新流,其中按比较器顺序排序 |
comparable:自然排序
3)终止操作(终端操作)
终止操作返回的是一个结果,就是所有中间操作做完之后进行的操作,比如汇总、遍历输出、求和等等
Stream操作案例 |
这里只是有选择性的做了几个案例,其实只要知道上面的“三步曲”,然后再知道点Lambda表达式,就能够进行Stream流式编程了。
1)筛选与切片
Listbooks = Arrays.asList( new Book("三国演义", 20, "罗贯中"), new Book("西游记", 25, "吴承恩"), new Book("水浒传", 30, "施耐庵"), new Book("红楼梦", 35, "曹雪芹") ); /** * 筛选出price大于等于30的书籍 */ @Test void test1() { //获取流 Stream bookStream = books.stream() //中间操作 .filter((book -> book.getPrice() >= 30)); //终止操作,遍历输出 bookStream.forEach(System.out::println); }/** 结果: * Book{name='水浒传', price=30, author='施耐庵'} * Book{name='红楼梦', price=35, author='曹雪芹'} */
2)排序
/** * 排序 * Listbooks = Arrays.asList( * new Book("水浒传", 30, "施耐庵"), * new Book("西游记", 25, "吴承恩"), * new Book("三国演义", 20, "罗贯中"), * new Book("红楼梦", 35, "曹雪芹") * ); */ @Test void test7() { books.stream().sorted((b1, b2) -> { if (b1.getPrice().equals(b2.getPrice())) { return b1.getName().compareTo(b2.getName()); } else { return b1.getPrice().compareTo(b2.getPrice()); } }).forEach(System.out::println); }/** * Book{name='三国演义', price=20, author='罗贯中'} * Book{name='西游记', price=25, author='吴承恩'} * Book{name='水浒传', price=30, author='施耐庵'} * Book{name='红楼梦', price=35, author='曹雪芹'} */
3)匹配
/** * 匹配 * allMatch() :是否全部匹配,返回boolean * anyMatch() :任意一个是否匹配,返回boolean */ @Test void test8() { System.out.println(books.stream().allMatch(book -> { if (book.getPrice().equals(25)) { return true; } return false; })); }
4)map映射
/** * map 映射 获取 所有book对象中最高的price */ @Test void test9() { Optionalmax = books.stream() .map(Book::getPrice) .max(Integer::compareTo); System.out.println("books中price最高为:" + max.get()); } /** *books中price最高为:30 */
转载地址:http://pphwi.baihongyu.com/