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里面是一个断言型接口,传入一个参数,返回一个boolean值 filter - 接受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 ); ; }