java8新特性之 Stream Api 之 规约 和收集(四)

/** *********************************规约********************************/


/**
 * 规约
 *
 * reduce(T identity ,BinaryOperator) / reduce  - 可以将流中元素冉福结合起来,得到一个值
 */
@Test
public void test11() {
    List<Integer> llist = Arrays.asList( 1,2,3,4,5,6,7,8 );

    //这种不可能为空
    Integer sun = llist.stream()
            //首先把0作为x  然后0+1得到1  然后把1作为x  然后1+2  逐渐结合
            .reduce( 0,(x,y) -> x+y );
    System.out.println(sun);



    //这种可能为空,因为没有起始值
   Optional<Integer> ss =  list.stream()
            .map((x) -> x.getId()  )
            .reduce((x,y) -> x+y);
   System.out.println(ss.get());
}






/** *********************************收集********************************/


/**
 * 收集
 * collect - 将流转化为其他形式,接受一个Collector接口的实现,用于给Stream中元素做汇总的方法
 */
@Test
public void test12() {

    /**
     * Collector接口中方法的实现决定了如何对流执行收集操作,(如收集到List,Set,Map)
     * 但是Collectors实用类提供了很多静态方法,可以方便的创建常见收集器实例
     */
    List l = list.stream()
            .map( (x) -> x.getName() )
            /**将得到的name放在list*/
            .collect( Collectors.toList() );
    l.forEach( System.out::println );



    list.stream()
            .map( (x) -> x.getName() )
            /**将得到的name放在set*/
            .collect( Collectors.toSet() );


    list.stream()
            .map( (x) -> x.getName() )
            /**将得到的name放在HashSet*/
            .collect( Collectors.toCollection( HashSet::new ) );





     Long l1 = list.stream()
                     /***得到集合的总数*/
                    .collect( Collectors.counting() );
     System.out.println(l1);


    Double d = list.stream()
                    /**id的平均值*/
                     .collect( Collectors.averagingDouble( Use::getId) );



    Double d1 = list.stream()
                     /**id的总和*/
                     .collect( Collectors.summingDouble(  Use::getId ) );



    Optional optional =  list.stream()
                         /**id的最大值*/
                        .collect( Collectors.maxBy((x,y) -> Double.compare( x.getId(),y.getId() )  ) );

     System.out.println( optional.get() );

                        /**id的最小值*/
     Optional<Integer> oo = list.stream( )
             .map( Use::getSaler ).min( Double::compare );
     System.out.println(oo.get());


    /**
     * 分组
     *
     * 按照id分组
     */
    Map <Integer, List <Use>> m = list.stream()
            .collect( Collectors.groupingBy( Use::getId ) );

    //遍历map
    for (Map.Entry map:m.entrySet()) {
        System.out.println(map.getKey());
        System.out.println(map.getValue());
    }
    System.out.println(m);


    /**
     * 组合分组
     * 满足条件一个区(true),不满足条件一个区(false)
     */
    Map<String, Map<Integer, List<Use>>> mapMap = list.stream()
          .collect( Collectors.groupingBy( Use::getName,Collectors.groupingBy( (e) -> e.getId() ) ) );


    /**
     * 分区
     */
    Map<Boolean, List<Use>> map =  list.stream()
            .collect( Collectors.partitioningBy( (e) -> e.getId()>3 ) );
    System.out.println(map);



    DoubleSummaryStatistics dd = list.stream()
            .collect( Collectors.summarizingDouble( (x) -> x.getId() ) );


    /**
     * 连接字符串
     */
    list.stream()
            .map( (x) -> x.getName() )
            .collect( Collectors.joining("z") );
    





}

猜你喜欢

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