JavaStream流练习
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);
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;
java stream}
}
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.(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);
}
}