• Java8新特性——stream流


    一、基本API初探

    package java8.stream;
    
    import java.util.Arrays;
    import java.util.IntSummaryStatistics;
    import java.util.List;
    import java.util.Random;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    
    /**
     * @author jiaqing.xu@hand-china.com
     * @version 1.0
     * @name
     * @description
     * @date 2018/7/15
     */
    public class BasicTest {
        public static void main(String[] args) {
    
            //创建串行流
            List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
            List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
            filtered.forEach(System.out::println);
    
            //使用foreach进行数据迭代 limit 方法用于获取指定数量的流
            Random random = new Random();
            random.ints().limit(10).forEach(System.out::println);
    
            //Map用于映射每个元素对应的结果,原值为i 映射到i*i .collect(Collectors.toList()):将stream再转换回list集合
            List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
            // 获取对应的平方数
            List<Integer> squaresList = numbers.stream().map( i -> i*i).distinct().limit(2).collect(Collectors.toList());
            squaresList.forEach(System.out::println);
    
            //filter 方法用于通过设置的条件过滤出元素
            List<String> stringList = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
            // 获取空字符串的数量
            Long count = stringList.stream().filter(string -> string.isEmpty()).count();
            System.out.println("The count of empty string:"+count);
    
    
            //sorted用于对流进行排序,默认是从小到大
            List<Integer> array = Arrays.asList(1,3,2,4);
            List<Integer> sortedList = array.stream().sorted().collect(Collectors.toList());
            sortedList.forEach(System.out::println);
    
            //流并行处理程序parallelStream
            List<String> stringList2 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl","");
            // 获取空字符串的数量
            Long count2 = stringList2.parallelStream().filter(string -> string.isEmpty()).count();
            System.out.println("The count of empty string:"+count2);
    
    
            //collectors 可以返回列表或者字符串
            List<String> stringList3 = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl","");
            String mergedString = stringList3.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));
            System.out.println("合并字符串: " + mergedString);
    
            //
            int[] numberList =  {12,3,34,67,100,99};
    
            IntStream intStream = IntStream.of(numberList);
            IntSummaryStatistics stats = intStream.summaryStatistics();
    
            System.out.println("列表中最大的数 : " + stats.getMax());
            System.out.println("列表中最小的数 : " + stats.getMin());
            System.out.println("所有数之和 : " + stats.getSum());
            System.out.println("平均数 : " + stats.getAverage());
        }
    }

    二、分组和合并

     1 /**
     2  * @author jiaqing.xu@hand-china.com
     3  * @version 1.0
     4  * @name
     5  * @description 分组、合并测试dto
     6  * @date 2018/7/15
     7  */
     8 public class Foo {
     9 
    10     private int code;
    11 
    12     private int count;
    13 
    14     public Foo(int code, int count) {
    15         this.code = code;
    16         this.count = count;
    17     }
    18 
    19     public int getCode() {
    20         return code;
    21     }
    22 
    23     public void setCode(int code) {
    24         this.code = code;
    25     }
    26 
    27     public int getCount() {
    28         return count;
    29     }
    30 
    31     public void setCount(int count) {
    32         this.count = count;
    33     }
    34 
    35     @Override
    36     public String toString() {
    37         return "Foo{" +
    38                 "code=" + code +
    39                 ", count=" + count +
    40                 '}';
    41     }
    42 }
    /**
     * @author jiaqing.xu@hand-china.com
     * @version 1.0
     * @name
     * @description 测试分组和合并  groupingBy方法以及reduce方法
     * @date 2018/7/15
     */
    public class TestFoo {
        public static void main(String[] args) {
            Foo foo1 = new Foo(1, 2);
            Foo foo2 = new Foo(2, 23);
            Foo foo3 = new Foo(2, 6);
            List<Foo> list = new ArrayList<>(4);
            list.add(foo1);
            list.add(foo2);
            list.add(foo3);
            Map<Integer, List<Foo>> collect = list.stream().collect(Collectors.groupingBy(Foo::getCode));
            //存储最后的汇总结果集合
            List<Foo> result = new ArrayList<>();
            collect.forEach((k,v)->{
                Optional<Foo> sum = v.stream().reduce(
                        (v1, v2) -> {  //合并
                            v1.setCount(v1.getCount()+v2.getCount());
                            return v1;
                        }
                );
                result.add(sum.orElse(new Foo(0,10)));
            });
            result.forEach(System.out::print);
    
        }
    }

    将2号记录的count值进行了合并汇总!23+6=29

  • 相关阅读:
    EF Core 打印日志
    生成各种开源挂件的网址
    .NET Core 原生 Aop,不依赖任何第三方
    .NET Core + Castle.DynamicProxy 拦截
    EF Core 审计日志
    Gitee 接口大全
    VS 批量新增文件头
    Linq 完全指南
    swagger转word
    大型网站架构
  • 原文地址:https://www.cnblogs.com/jiaqingshareing/p/9313569.html
Copyright © 2020-2023  润新知