zoukankan      html  css  js  c++  java
  • Java学习

    Java Stream 基础练习1

    Predicate 接口

    Integer[] arr = {-12345,9999,520,0,-38,-7758520,941213};
    // a) 使用lambda表达式创建Predicate对象p1,p1能判断整数是否是自然数(大于等于0)
    Predicate<Integer> p1 = (o1) -> (o1>=0);
    // b) 使用lambda表达式创建Predicate对象p2,p2能判断整数的绝对值是否大于100
    Predicate<Integer> p2 = (o1)->(Math.abs(o1)>100);
    // c) 使用lambda表达式创建Predicate对象p3,p3能判断整数是否是偶数
    Predicate<Integer> p3 = (o1)->(o1%2==0);
    
    // 打印自然数的个数
    int cnt = 0;
    for(Integer i : arr) {
        if(p1.test(i)) {
            cnt++;
        }
    }
    
    System.out.println(cnt);
    
    // 打印负整数的个数
    cnt = 0;
    for(Integer i : arr) {
        if(p1.negate().test(i)) {
            cnt++;
        }
    }
    
    System.out.println(cnt);
    
    // 打印绝对值大于100的偶数的个数
    
    cnt = 0;
    for(Integer i : arr) {
        if(p2.test(i)) {
            cnt++;
        }
    }
    
    System.out.println(cnt);
    
    //  打印是负整数或偶数的数的个数
    
    cnt = 0;
    for(Integer i : arr) {
        if(p1.negate().or(p3).test(i)) {
            cnt++;
        }
    }
    
    System.out.println(cnt);
    

    Function 接口

    // 使用lambda表达式分别将以下功能封装到Function对象中
    // a) 求Integer类型ArrayList中所有元素的平均数
    
    Function<ArrayList<Integer>,Integer> fun1 = (list)->{
        Integer sum = 0;
        for(Integer i : list) {
            sum += i;
        }
        return sum / list.size();
    };
    
     // b) 将Map<String,Integer>中value存到ArrayList<Integer>中
    Function<Map<String,Integer>,ArrayList<Integer>> fun2 = (map)->{
        ArrayList<Integer> arrlist = new ArrayList<>();
        map.forEach((k,v)-> arrlist.add(v));
        return arrlist;
    };
    
    /*
    已知学生成绩如下
    姓名 成绩
    岑小村 59
    谷天洛 82
    渣渣辉 98
    蓝小月 65
    皮几万 70
    以学生姓名为key成绩为value创建集合并存储数据,使用刚刚创建的Function对象求学生的平均成绩
    */
    
    Map<String,Integer> map = new HashMap<String,Integer>();
    map.put("岑小村", 59);
    map.put("谷天洛", 82);
    map.put("渣渣辉", 98);
    map.put("蓝小月", 65);
    map.put("皮几万", 70);
    
    
    double avgScore = (double)(fun1.apply(fun2.apply(map))) / map.size();
    System.out.println(avgScore);
    

    获取流

    // 简述单列集合、双列集合、数组分别如何获取Stream流对象,并进行演示
    // 1) 从ArrayList获取流
    ArrayList<Integer> arrlist = new ArrayList<>();
    Stream<Integer> s1 = arrlist.stream();
    
    // 2) 从Map获取流
    Map<String,Integer> map = new HashMap<String,Integer>();
    // map.keySet() -> Set<String>
    Stream<String> keyStream = map.keySet().stream(); 
    // map.values -> Collection<Integer>
    Stream<Integer> valueStream = map.values().stream(); 
    // map.entrySet() -> Set<Entry<String,Integer>> getKey(),getValue()
    Stream<Map.Entry<String,Integer>> s2 = map.entrySet().stream();
    
    
    // 3)从Array获取流
    String[] arr = {"1","2","3","4","5"};
    Stream<String> s3 = Stream.of(arr);
    
    int[] arr2 = {1,2,3,4,5};
    IntStream s4 = Arrays.stream(arr2);
    

    过滤:filter、结果收集(数组)

    // 有如下7个元素
    // 黄药师,冯蘅,郭靖,黄蓉,郭芙,郭襄,郭破虏
    // 使用Stream将以郭字开头的元素存入新数组
    ArrayList<String> arrlist = new ArrayList<>();
    arrlist.add("黄药师");
    arrlist.add("冯蘅");
    arrlist.add("郭靖");
    arrlist.add("黄蓉");
    arrlist.add("郭芙");
    arrlist.add("郭襄");
    arrlist.add("郭破虏");
    
    ArrayList<String> ans = (ArrayList<String>)
            arrlist.stream()
            .filter(o1->o1.charAt(0)=='郭')
            .collect(Collectors.toList());
    
    ans.forEach(o1->{System.out.println(o1);});
    
    // 法二
    Stream<String> stream = Stream.of("黄药师", "冯蘅", "郭靖", "黄蓉", "郭芙", "郭襄", "郭破虏");
    String[] guos = stream.filter(s -> s.startsWith("郭")).toArray(String[]::new);
    

    取用前几个:limit、跳过前几个:skip

    /*
    已知ArrayList集合中有如下元素{陈玄风、梅超风、陆乘风、曲灵风、武眠风、冯默风、罗玉风},使用Stream
    1、取出前2个元素并在控制台打印输出。
    2、取出后2个元素并在控制台打印输出。
    */
    
    ArrayList<String> arrlist = (ArrayList<String>)
            Stream.of("陈玄风","梅超风","陆乘风","曲灵风","武眠风","冯默风","罗玉风")
            .collect(Collectors.toList());
    
    arrlist.stream().limit(2).forEach(o1->{System.out.println(o1);});
    arrlist.stream().skip(5).forEach(o1->{System.out.println(o1);});
    

    映射:map、逐一消费:forEach

    /*
     有如下整数1,-2,-3,4,-5
     使用Stream取元素绝对值并打印
     */
    
    Stream.of(-1,-2,-3,4,-5).map(o1->Math.abs(o1)).forEach(o1->{System.out.println(o1);});
    
    // 法二
    Stream<Integer> stream = Stream.of(1, -2, -3, 4,-5);
    stream.map(Math::abs).forEach(System.out::println);
    /*
    ::的作用
    简单来讲,就是构造一个该方法的闭包。比如:
    Math::max等效于(a, b)->Math.max(a, b)
    String::startWith等效于(s1, s2)->s1.startWith(s2)s::isEmpty等效于()->s.isEmpty()
    */
    

    组合:concat、结果收集(list)

    /*
     已知数组arr1中有如下元素{郭靖,杨康},arr2中有如下元素{黄蓉,穆念慈},使用Stream将二者合并到List集合
     */
    String[] arr1 = {"郭靖","杨康"};
    String[] arr2 = {"黄蓉","穆念慈"};
    @SuppressWarnings("unchecked")
    List<String> list = (List<String>)Stream
        .concat(Stream.of(arr1),Stream.of(arr2))
        .collect(Collectors.toList());
    list.forEach(System.out::println);
    
    ---- suffer now and live the rest of your life as a champion ----
  • 相关阅读:
    微服务之集成(四)
    后缀数组
    HDU-6514 Monitor(二维前缀和+差分)
    前缀和、二维前缀和与差分
    2019年icpc上海网络赛 B Light bulbs (分块、差分)
    树状数组
    2019ICPC 上海网络赛 L. Digit sum(二维树状数组+区间求和)
    [USACO09MAR]向右看齐Look Up(单调栈、在线处理)
    Pay Back(模拟)
    [USACO09MAR]Moon哞哞叫Moon Mooing(模拟)
  • 原文地址:https://www.cnblogs.com/popodynasty/p/13854575.html
Copyright © 2011-2022 走看看