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);
}
}