Java8 特性-stream流使用
程序员文章站
2022-03-08 08:06:07
...
Java8 特性-stream流使用
- 创建Stream;
Stream<String> stream = Stream.of( "111", "2222", "333", "44444", null, "777", "2222" );
-
转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(可以有多次转换);
-
Stream与集合互转,当然也可以转换为Set集合
List<String> list = Arrays.asList( "111", "2222", "333", "44444",null,"777","2222" );
Set<String> collect = list.stream().filter( f -> f != null ).filter( (String f) -> !f.equals( "111" ) ).collect( Collectors.toList() ).stream().filter( (String f) -> !f.equals( "777" ) ).collect( Collectors.toSet() );
- filter: 对于Stream中包含的元素使用给定的过滤函数进行过滤操作,新生成的Stream只包含符合条件的元素;
- filter过滤函数是可以重复调用的;
- 案例中过滤掉空值,过滤点String 为111和777的值
List<String> list = Arrays.asList( "111", "2222", "333", "44444",null,"777","2222" );
Set<String> collect = list.stream().filter( f -> f != null ).filter( (String f) -> !f.equals( "111" ) ).collect( Collectors.toList() ).stream().filter( (String f) -> !f.equals( "777" ) ).collect( Collectors.toSet() );
collect.forEach( f-> System.out.println(f) );
- 测试结果
- map: 对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,这个新生成的Stream中的元素都是int类型;
- 这里map可以理解为对象处理器,针对当前对象处理;
- 如果只有一行代码,默认返回该代码结果,省略return语句,多行代码需要在->后加方法体{},并且加return语句;
List<String> list = Arrays.asList( "111", "2222", "333", "44444",null,"777","2222" );
Set<Double> map = list.stream().filter( f -> f != null ).map( (String m) -> Double.valueOf( m ) ).collect( Collectors.toSet() );
map.forEach( s-> System.out.println(s) );
- 测试结果
- peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
- limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
- skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
- 一般skip与limit连用,实现数据分片效果;skip跳过,limit分片数据;
- 对于distinct、count等聚合函数,可以理解为sql语句执行顺序那样,重要的是每一步要清晰的知道返回数据结果结构,读取这样的代码,貌似在读一篇文章;
List<String> list = Arrays.asList( "111", "2222", "333", "44444",null,"777","sss" );
List<String> collect = list.stream().filter( f->f!=null ).distinct().skip( 2 ).limit( 3 ).collect( Collectors.toList() );
collect.forEach( System.out::println );
long count = list.stream().filter( f -> f != null ).distinct().skip( 2 ).limit( 3 ).count();
System.out.println("-----------------------------");
System.out.println(count);
测试结果:
- allMatch:是不是Stream中的所有元素都满足给定的匹配条件;
- anyMatch:Stream中是否部分元素满足匹配条件;
- findFirst: 返回Stream中的第一个元素,如果Stream为空,返回空Optional;
- noneMatch:是不是Stream中的所有元素都不满足给定的匹配条件;
- max和min:使用给定的比较器(Operator),返回Stream中的最大|最小值;
- Operator是java8针对java.lang.NullPointerException问题提出的问题解决类;
- isPresent和ifPresent一般跟在比较断言后,提出对结果的猜想;
List<String> list = Arrays.asList( "111", "2222", "333", "44444",null,"777","2222" );
boolean b1 = list.stream().allMatch( m -> m == null );
System.out.println("是否全部为空" + b1);
boolean b2 = list.stream().anyMatch( m -> m == null );
System.out.println("是否部分为空" + b2);
boolean b3 = list.stream().noneMatch( m -> m == null );
System.out.println("是否全部不为空" + b3);
System.out.println("-----------------------------");
Optional<String> max = list.stream().filter( f -> f != null ).max( (m1, m2) -> Integer.valueOf( m1 ) - Integer.valueOf( m2 ) );
System.out.println(max.orElse( null ));
System.out.println("-----------------------------");
boolean present = list.stream().filter( f -> f != null ).max( (m1, m2) -> Integer.valueOf( m1 ) - Integer.valueOf( m2 ) ).isPresent();
System.out.println(present);
System.out.println("-----------------------------------");
list.stream().filter( f -> f != null ).max( (m1, m2) -> Integer.valueOf( m1 ) - Integer.valueOf( m2 ) ).ifPresent(s-> System.out.println(s));
测试结果:
chenyb 随笔记录,只为方便自己学习
2019-10-012
上一篇: iceberg flink 写操作
下一篇: wpf无边框窗体移动和大小调整
推荐阅读
-
asp.net使用DataSet的ReadXml读取XML文件及Stream流的方法
-
Java8中Lambda表达式使用和Stream API详解
-
Java8新特性(三)集合之 Stream 流式操作
-
Java8新特性Stream的完全使用指南
-
Java8 Stream Collectors收集器使用方法解析
-
Java8之Stream流代替For循环操作
-
java8新特性之stream流中reduce()求和知识总结
-
乐字节-Java8核心特性实战之Stream(流)
-
Java8开发基础(Stream流方法使用详解)
-
荐 Java语言基础之JDK1.8新特性(Lambda表达式、函数式接口、Stream流、新的日期API)