java8新特性之 StreamApi Stream流的中间操作(二)

多个中间操作可以连接起来形成一个流水线,除非流水线上触发中止操作,否则中间操作不会执行任何的处理,而在中止操作时一次性全部处理




















/***********************************************    Stream流的中间操作     ***************************************************************/


/**
 * Stream流的中间操作
 */


/**
 * 筛选与切片
 *
 * filter - 接受Lambda,从流中排除某些元素
 * limit - 截断流,使其元素不超过给定数量
 * skip(n) - 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n,则返回一个空流,limit互补
 * distinct - 筛选,通过流所生产元素的hashCode() equals() 去除重复元素
 */
final List<Use> list = Arrays.asList(
        new Use( "a",1,3 ),
        new Use( "e",5,4 ),
        new Use( "c",2,5 ),
        new Use( "b",4,2 ),
        new Use( "e",3,1 ));

//内部迭代
@Test
public void test2() {

    /**
     * 中间操作不会单独执行.只有执行中止操作才会去执行中间,
     */
            //创建Stream对象
   Stream stream =  list.stream()
           //中间操作
            /** filter里面是一个断言型接口,传入一个参数,返回一个booleanfilter - 接受Lambda,从流中排除某些元素*/
            .filter( (x) -> x.getId()>1);
            //中止操作
            stream.forEach( System.out::println );

}

@Test
public void test4() {
    list.stream()
            .filter( (x) -> x.getSaler()>2 )
            /**只需要找到满足条件之后,就不会去继续迭代其他,提高了效率,  limit - 截断流,使其元素不超过给定数量*/
            .limit( 2 )
            .forEach( System.out::println );
}


@Test
public void test5() {
    list.stream()
            .filter( (x) -> x.getId()>0 )
            .limit(3 )
            /**skip(n) - 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n,则返回一个空流,limit互补*/
            .skip( 2 )
            .forEach( System.out::println );
}


@Test
public void test6() {
    list.stream()
            .filter( (x) -> x.getId()>0 )
            .limit( 5 )
            .skip( 2 )
            /**distinct - 筛选,通过流所生产元素的hashCode() equals() 去除重复元素  在使用此方式时一定要重写hashCode() equals()*/
            .distinct()
            .forEach( System.out::println );
}
//外部迭代
@Test
public void test3() {
    Iterator<Use> stream = list.iterator();
    if(stream.hasNext()) {
        System.out.println(stream.next());
    }

}




/**
 * 映射
 *
 * map - 接收Lambda,将元素转化成其他形式或提取信息,接收一个函数作为参数,改元素会应用到每个元素上,
 * 并将其映射成一个新的元素,
 *
 * flatMap - 接收一个函数作为参数,将流中的的每个值都换成另一个流,然后把所有的流连接成一个流
 */

@Test
public void test7() {
    List<String> slist = Arrays.asList( "aa","bb","cc","dd","ee","ff","gg" );
    slist.stream()
            /**map 的作用是将集合中的每个属性放在函数中去执行,执行的结果作为一个新的流,最后在中止操作中打印出来*/
            .map( (x) -> x.toUpperCase() )
            .forEach( System.out::println );


            list.stream()
                    .map( Use::getSaler )
                    .forEach( System.out::println );



            //
          Stream<Stream<Character>>  ssss =  slist.stream()
                    .map( (x) -> getString( x ));

          ssss.forEach( (x) ->{
              x.forEach( System.out::println );
          } );
}


@Test
public void test8() {
    List<String> slist2 = Arrays.asList( "aa","bb","cc","dd","ee","ff","gg" );
    /**map是使一个流中,存在几个小的流,这样就形成了几个小的流.形成一个大的流,所有在遍历时先去遍历大的流.得到每个小的流后再去遍历这个小流*/
    Stream<Stream<Character>>  ssss =  slist2.stream()
            .map( (x) -> getString( x ));

    ssss.forEach( (x) ->{
        x.forEach( System.out::println );
    } );



    /**flatMap - 接收一个函数作为参数,将流中的的每个值都换成另一个流,然后把所有的流连接成一个流*/
    Stream<Character> stream = slist2.stream()
            .flatMap( (x) -> getString( x ) );

    stream.forEach( System.out::println );

}

public static Stream<Character> getString(String str) {
    List<Character> sslist = new ArrayList <>(  );
    for(Character c:str.toCharArray()) {
        sslist.add( c );
    }
    return sslist.stream();
}




/**
 * 排序
 *
 * sortrd - 自然排序
 *
 * sorted(Comparator con) - 定制排序
 */

@Test
public void test9() {
    List<String> slist2 = Arrays.asList( "bb","ff","cc","dd","aa","ee","gg" );
    slist2.stream()
            //自然排序
            .sorted()
            .forEach( System.out::println );


    list.stream()
            //定制排序
            .sorted((x,y) -> {
                if(x.getId( ).equals( y.getId( ) )) {
                    return x.getSaler().compareTo( y.getSaler() );
                }else {
                    return x.getId().compareTo( y.getId() );
                }})
            .forEach( System.out::println );
            ;
}






































































猜你喜欢

转载自blog.csdn.net/weixin_41404773/article/details/80909598