Java Stream流 练习

1、 在Java内置的函数式接口中,Predicate是一个断言型接口,提供了对输入的参数进行断定并返回boolean类型的功能。 在Java 8版本中,Collection接口提供了一个默认的方法removeIf,使用者可以根据自定义的filter对集合内的元素进行移除,其参数就是Predicate接口类型。
default boolean removeIf(Predicate<? super E> filter)
现获取到一个ArrayList集合,如下:
List list = List.of(“java”, “JAVAse”, “javaee”, “html”, “css”, “JavaScript”);
ArrayList strs = new ArrayList<>();
strs.addAll(list);
// 将集合strs中凡是以"java"开头(不区分大小写)的元素删除
请使用Collection中的removeIf方法实现注释中的需求。

public static void main(String[] args) {
    List<String> list = List.of("java", "JAVAse", "javaee", "html", "css", "JavaScript");
    ArrayList<String> strs = new ArrayList<>();
    strs.addAll(list);
    strs.removeIf(s -> s.startsWith("java"));
    System.out.println(strs);
}

2、 在Java内置的函数式接口中,Predicate是一个断言型接口,提供了对输入的参数进行断定并返回boolean类型的功能。请阅读如下材料:
public class PredicateDemo {
public static void main(String[] args) {
List strings = Arrays.asList(“123”, “123456”, “abcdef”, “abc123”, “ab123cd”, “7654321”, “123abc”, “123s456”, “123456789123”);
/*
请调用filterStr方法,将其中符合条件的元素保存到新集合
条件一:元素长度为[5-10],包含5和10
条件二:元素只能包含数字字符
*/

    // 遍历新集合

}

public static List<String> filterStr(List<String> strs, Predicate<String> pre1, Predicate<String> pre2) {
    List<String> list = new ArrayList<>();
    for (String str : strs) {
        if (pre1.and(pre2).test(str))
            list.add(str);
    }
    return list;
}

}
在类中,已经提供了filterStr方法,用于过滤集合中的数据,请在主方法中调用该方法,并使用Lambda表达式实现注释中的需求。

 public static void main(String[] args) {
        List<String> strings = Arrays.asList("123", "123456", "abcdef", "abc123",
                "ab123cd", "7654321", "123abc", "123s456", "123456789123");

        List<String> strings1 = filterStr(strings, s -> s.length() > 4 && s.length() < 11, s -> {
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c < '0' || c > '9'){
                    return false;
                }
            }
            return true;
        });
        System.out.println(strings1);
    }
    public static List<String> filterStr(List<String> strs, Predicate<String> pre1, Predicate<String> pre2) {
        List<String> list = new ArrayList<>();
        for (String str : strs) {
            if (pre1.and(pre2).test(str))
                list.add(str);
        }
        return list;
    }

3、 在Java内置的函数式接口中,Function<T, R>是一个函数型接口,表示接收一个参数输入并产生一个输出值的操作。其中的抽象方法:
R apply(T t); // 将此函数应用于给定的参数。即自定义参数类型和返回值类型的函数。
请观察有如下代码:
public class FunctionDemo {
public static void main(String[] args) {
// 在此处调用sum方法,将结果打印到控制台
}

public static Integer sum(Integer i, Function<Integer, Integer> fun) {
    return fun.apply(i);
}

}
请调用上述定义的sum方法,实现:对于传入的正整数n,获取从1到n之间的整数之和,对于传入的负整数n,获取从n到-1之间的整数之和。请使用Lambda表达式实现。

 public static void main(String[] args) {
        int res = sum(-5, integer -> {
            if (integer > 0){
                return integer * (integer + 1) / 2;
            }else {
                return -integer * (integer + 1) / 2;
            }
    });
        System.out.println(res);
    }



    public static Integer sum(Integer i, Function<Integer, Integer> fun) {
        return fun.apply(i);
    }


4、使用lambda表达式分别将以下功能封装到Function对象中: 1、将Map<String, Integer>中所有的值存到ArrayList中 2、求存储元素为Integer类型的ArrayList中所有元素的平均数 已知,学生成绩如下:
张三 85
李四 80
王五 90
赵六 95
田七 70
请以学生姓名为key,成绩为value创建集合并存储数据。然后分别使用步骤1和2中所创建的Function对象求出学生的平均成绩。

 public static void main(String[] args) {
        ArrayList<Integer>  arr =new ArrayList<>();
        Map<String,Integer>  map = new HashMap<>();
        map.put("张三",85);
        map.put("李四",80);
        map.put("王五",90);
        map.put("赵六",95);
        map.put("田七",70);
        Set<String> str = map.keySet();
        str.stream().forEach(s -> arr.add(map.get(s)));
        int sum = arr.stream().mapToInt(value -> value).sum()/arr.size();
        System.out.println(sum);
    }

5、【编号:2307】 我国有34个省级行政区,分别是: 23个省:河北省、山西省、吉林省、辽宁省、黑龙江省、陕西省、甘肃省、青海省、山东省、福建省、浙江省、台湾省、河南省、湖北省、湖南省、江西省、江苏省、安徽省、广东省、海南省、四川省、贵州省、云南省。 4个直辖市:北京市、天津市、上海市、重庆市。 5个自治区:内蒙古自治区、新疆维吾尔自治区、宁夏回族自治区、广西壮族自治区、西藏自治区。 2个特别行政区:香港特别行政区、澳门特别行政区。 请使用流依次完成下列操作: 1、统计三个字的省份的个数 2、统计名字中包含方位名词的省份(东西南北)的个数 3、打印名字中包含方位名词的普通省份(非自治区直辖市特别行政区)的名字 4、将所有的特殊省份(自治区直辖市特别行政区)提取出来并放到新数组中

public static void main(String[] args) {
        String[] arr = {"河北省", "山西省", "吉林省", "辽宁省",
                "黑龙江省", "陕西省", "甘肃省", "青海省", "山东省",
                "福建省", "浙江省", "台湾省", "河南省", "湖北省",
                "湖南省", "江西省", "江苏省", "安徽省", "广东省",
                "海南省", "四川省", "贵州省", "云南省", "北京市",
                "天津市", "上海市", "重庆市", "内蒙古自治区",
                "新疆维吾尔自治区", "宁夏回族自治区", "广西壮族自治区",
                "西藏自治区", "香港特别行政区", "澳门特别行政区"};


        long count = Stream.of(arr).filter(s -> s.endsWith("省")).filter(s -> s.length() == 3).count();
        System.out.println("三个字的省份有:"+count+"个");

        long cou = Stream.of(arr).filter(s -> s.endsWith("省"))
         .filter(s -> s.contains("东") || s.contains("南") || s.contains("西") || s.contains("北")).count();

        System.out.println("名字中包含方位名词的省份有:"+cou+"个");

        System.out.println("名字中包含方位名词的普通省份:");
       Stream.of(arr).filter(s -> s.endsWith("省")).filter(s -> s.contains("东") || s.contains("南") || s.contains("西") || s.contains("北")).forEach(System.out::println);

        System.out.println();
        String[] strings = Stream.of(arr).filter(s -> s.endsWith("市") || s.endsWith("自治区") || s.endsWith("行政区")).toArray(String[]::new);
        System.out.println("特殊省份分别是:");
        for (String string : strings) {
            System.out.println(string);
        }


    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值