java8最全版stream特性map(),collect(),flatmap()等及示例分析

为什么使用stream呢

优点:
1.无存储
stream它并不是一种数据结构,只是某种数据源的一个视图,这个数据源可以是一个数组,Java容器或I/O channel等。
2.函数式编程
对stream进行的任何修改都不会修改背后的数据源,比如对stream执行过滤操作(filter)并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新的流(新的stream)。
3.惰式执行原则
stream上的操作不会立即执行,只有等到使用者真正需要结果的时候才会执行。
4.可消费性
stream只能被“消费”一次,遍历过一次即失效,就像容器的迭代器那样,下一次再要遍历必须重新生成。

forEach()

示例1:
bookInfoMap.forEach((bookId, titleAndPages) -> Collections.sort(titleAndPages.getPages()));
详解:
forEach():迭代流中的每个数据。forEach是map中的一种更优雅的迭代方式。
JDK8强化了针对 Map 类的迭代方式,新增了一个默认方法 forEach,它接收一个 BiConsumer 函数。JDK给出的描述为:

对该映射中的每个条目执行给定的操作,直到所有条目已被处理或动作抛出异常为止。

Collections.sort():排序:本示例中是根据titleAndPages.getPages()方法得到的page值进行排序

parallelStream()

stream和parallelStream就是一种流的处理方式,前者是单管,后者是多管道。 parallelStream()可能提高你的多线程任务的速度,但是可能存在线程安全问题。

stream().map().collect()用法

示例1:
Map<Integer, UserBookOfflineVO> bookInfoMap = pencilService.getBookInfoMap(addressList);
bookInfoMap.keySet().stream().map(bookInfoMap::get).collect(Collectors.toList())
详解:
keySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所以可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key
用 for (String key : bookInfoMap.keySet())读取map
entrySet():的返回值是一个Set集合,此集合的类型为Map.Entry。Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示的是Map中的一个实体(key-value)。
steam():把一个源数据,可以是集合,数组,I/O channel, 产生器generator 等,转化成流。
map():用于映射每个元素到对应的结果。
bookInfoMap:一个实体类的集合,类型为Map<Integer, UserBookOfflineVO>
get:实体类中的get方法
Collectors(): 类实现了很多归约操作,例如将流转换成集合(eg:Collectors.toList())和聚合元素(eg:Collectors.joining(", ")可用于拼接字符串)。Collectors 可用于返回列表或字符串

flatMap()

使用flatMap方法的效果是,各个数组并不是分别映射一个流,而是映射成流的内容,所有使用map(Array::stream)时生成的单个流被合并起来,即扁平化为一个流。

collect()

1.toList()

bookInfoMap.keySet().stream().map(bookInfoMap::get).collect(Collectors.toList())

2.toSet()

bookInfoMap.keySet().stream().map(bookInfoMap::get).collect(Collectors.toSet())

3.转成值

averagingDouble:求平均值,Stream的元素类型为double
averagingInt:求平均值,Stream的元素类型为int
averagingLong:求平均值,Stream的元素类型为long
counting:Stream的元素个数
maxBy:在指定条件下的,Stream的最大元素
minBy:在指定条件下的,Stream的最小元素
reducing: reduce操作
summarizingDouble:统计Stream的数据(double)状态,其中包括count,min,max,sum和平均。
summarizingInt:统计Stream的数据(int)状态,其中包括count,min,max,sum和平均。
summarizingLong:统计Stream的数据(long)状态,其中包括count,min,max,sum和平均。
summingDouble:求和,Stream的元素类型为double
summingInt:求和,Stream的元素类型为int
summingLong:求和,Stream的元素类型为long
Optional<Integer> collectMinBy = Stream.of(2,4,7,9)
            .collect(Collectors.minBy(Comparator.comparingInt(o -> o)));
System.out.println("collectMinBy:" + collectMinBy.get());
// collectMinBy:2

4.分割数据块

Map<Boolean, List<Integer>> collectPartI = Stream.of(2,4,7,9)
            .collect(Collectors.partitioningBy(it -> it % 2 != 0));
System.out.println("collectPartI : " + collectPartI);
// collectParti : {false=[2,4], true=[7,9]}

5.数据分组

Map<Boolean, List<Integer>> collectGroup= Stream.of(2,4,7,9)
            .collect(Collectors.groupingBy(it -> it > 7));
System.out.println("collectGroup : " + collectGroup);
// collectGroup : {false=[2,4,7], true=[9]}

filter():

filter 方法用于通过设置的条件过滤出元素。
注意:并不会真正删除被过滤的元素,而是生成一个新的stream
以下代码片段使用 filter 方法过滤出空字符串:

List<String>str = Arrays.asList("abc", "bcd", "", "efg", "abcd","", "mdl");
// 获取空字符串的数量
int count = str.stream().filter(string -> string.isEmpty()).count();

limit()

该方法用于获取指定数量的流。

//使用 limit 方法打印出 100 条数据:
Random random = new Random();
random.ints().limit(100).forEach(System.out::println);

sorted()

对流进行排序。

//使用 sorted 方法对输出的 100 个随机数进行排序:
Random random = new Random();
random.ints().limit(100).sorted().forEach(System.out::println);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值