2020你还不会Java8新特性? (6)

遇到问题的时候,先思考一下能否用方法引用的方式,使用流的方式来操作。因为用起来比较简单。

举例:将集合中的每一个元素 转换成大写的字母, 给输出来。 public static void main(String[] args) { //将集合中的每一个元素 转换成大写的字母, 给输出来 List<String> list = Arrays.asList("hello","world","hello world"); //转成字符串,然后转成大写. // System.out.println(list.stream().collect(Collectors.joining()).toUpperCase()); //上面的代码 可以转换成下边的代码. // System.out.println(String.join("", list).toUpperCase()); //视频上给出的 还是List的大写 list.stream().map(String::toUpperCase).collect(Collectors.toList()).forEach(System.out::println); //将集合 的数据给平方一下输出. List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); list1.stream().map(item -> item * item).collect(Collectors.toList()).forEach(System.out::println); }

流中的 .map () 方法,是对集合中的每一个数据进行一下操作。

stream 的 flat操作。 打平操作。 public static void main(String[] args) { // 举例: flag 的操作, 打平. 一个集合中有三个数组, 打平之后,三个数组的元素依次排列. Stream<List<Integer>> stream = Stream.of(Arrays.asList(1), Arrays.asList(2, 3), Arrays.asList(4, 5)); //将里边每一个ArrayList的数据 做一个平方. 然后打平. 输出一个list stream.flatMap(theList -> theList.stream()).map(item -> item * item).forEach(System.out::println); } Stream 其他方法介绍: public static void main(String[] args) { // stream 其他方法介绍. // generate(). 生成stream对象 Stream<String> stream = Stream.generate(UUID.randomUUID()::toString); // System.out.println(stream.findFirst().get()); // findFirst,找到第一个对象.然后就短路了,会返回一个Optional对象(为了避免NPE),不符合函数式编程 // stream.findFirst().isPresent(System.out::print); // iterate() 会生成 一个 无限的串行流. // 一般不会单独使用. 会使用limit 来限制一下总长度. Stream.iterate(1, item -> item + 2).limit(6).forEach(System.out::println); } Stream 运算练习:(Stream提供了各种操作符) 举例:找出该流中大于2的元素,然后每个元素*2 ,然后忽略掉流中的前两个元素,然后再取流中的前两个元素,最后求出流元素中的总和. Stream<Integer> stream = Stream.iterate(1, item -> item + 2).limit(6); //找出该流中大于2的元素,先使用filter()过滤. //每个元素*2 使用mapToInt 避免重复拆箱. //忽略掉流中的前两个元素; 使用 skip(2) //再取流中的前两个元素; 使用limit(2) //求出流元素中的总和. 使用sum() System.out.println(stream.filter(item -> item>2).mapToInt(item -> item * 2).skip(2).limit(2).sum()); 举例:找出该流中大于2的元素,然后每个元素*2 ,然后忽略掉流中的前两个元素,然后再取流中的前两个元素,最后找到最小的元素. // .min() 返回的是IntOptional. // System.out.println(stream.filter(item -> item>2).mapToInt(item -> item * 2).skip(2).limit(2).min()); //应该这样调用. 上边的可能会出NPE异常 stream.filter(item -> item>2).mapToInt(item -> item * 2).skip(2).limit(2).min().ifPresent(System.out::println); 举例:获取最大值,最小值,求和等各种操作。 .summaryStatistics();

image-20200104172236805

在练习的过程中发现了一个问题。如果是这样连续打印两条对流操作之后的结果。会报流未关闭的异常。

image-20200104170801230

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgpf.html