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