欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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) );
  • 测试结果

Java8 特性-stream流使用

  • 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) );
  • 测试结果

Java8 特性-stream流使用

  • peek: 生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数;
  • limit: 对一个Stream进行截断操作,获取其前N个元素,如果原Stream中包含的元素个数小于N,那就获取其所有的元素;
  • skip: 返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream;
  • 一般skiplimit连用,实现数据分片效果;skip跳过,limit分片数据;
  • 对于distinctcount等聚合函数,可以理解为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);

 测试结果:

Java8 特性-stream流使用

  • 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));

测试结果:

Java8 特性-stream流使用

chenyb 随笔记录,只为方便自己学习

2019-10-012

 

 

 

相关标签: Mr.chenyb