Java-常用函数式接口练习

常用函数式接口之Supplier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.fluffysponge;

import java.util.function.Supplier;

/*
* 定义一个类(SupplierTest),在类中提供两个方法
* 一个方法是:int getMax(Supplier<Integer> sup) 用于返回一个int数组中的最大值
* 一个方法是主方法,在主方法中调用getMax方法
* */
public class SupplierTest {
public static void main(String[] args) {
//定义一个int数组
int[] arr = {19,50,28,37,46};

int maxValue = getMax(() -> {
int max = arr[0];
for (int x : arr) {
if (x > max)
max = x;
}
return max;
});

System.out.println(maxValue);
}

//返回一个int数组中的最大值
private static int getMax(Supplier<Integer> sup){
return sup.get();
}
}

常用函数式接口之Consumer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.fluffysponge;

import java.util.function.Consumer;

/*
* String[] strArray = {"张三,30","李四,35","王五,33"};
* 字符串数组中有多条信息,请按照格式:"姓名:XX,年龄:XX"的格式将信息打印出来
* 要求:
* 把打印姓名的动作作为第一个Consumer接口的Lambda实例
* 把打印年龄的动作作为第二个Consumer接口的Lambda实例
* 将两个Consumer接口按照顺序组合到一起使用
* */
public class ConsumerTest {
public static void main(String[] args) {
String[] strArray = {"张三,30","李四,35","王五,33"};

// printInfo(strArray,(String str) -> {
// String name = str.split(",")[0];
// System.out.print("姓名:" + name);
// },(String str) ->{
// int age = Integer.parseInt(str.split(",")[1]);
// System.out.println(",年龄:" + age);
// });

printInfo(strArray,str -> System.out.print("姓名:" + str.split(",")[0]),
str-> System.out.println(",年龄:" + Integer.parseInt(str.split(",")[1])));
}

private static void printInfo(String[] strArray, Consumer<String> con1, Consumer<String> con2){
for(String str : strArray){
con1.andThen(con2).accept(str);
}
}
}

常用函数式接口之Predicate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.fluffysponge;

import java.util.ArrayList;
import java.util.function.Predicate;

/*
* String[] strArray = {"张三,30","李四,34","王五五,35","朱六,31","卓七,33"};
* 字符串数组中有多条信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,并遍历ArrayList集合
* 要求:同时满足如下要求
* 1.姓名长度大于2
* 2.年龄大于33
* 分析:
* 1.有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断
* 2.必须同时满足两个条件,所以可以使用and方法连接两个判断条件
* */
public class PredicateTest {
public static void main(String[] args) {
String[] strArray = {"张三,30","李四,34","王五五,35","朱六,31","卓七,33"};

ArrayList<String> array = myFilter(strArray, s -> s.split(",")[0].length() > 2,
s -> Integer.parseInt(s.split(",")[1]) > 33);

for(String str : array){
System.out.println(str);
}

}

//通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中
private static ArrayList<String> myFilter(String[] strArray, Predicate<String> pre1,Predicate<String> pre2){
//定义一个集合
ArrayList<String> array = new ArrayList<>();

//遍历数组
for(String str: strArray){
if(pre1.and(pre2).test(str)){
array.add(str);
}
}
return array;
}

}

常用函数式接口之Function

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.fluffysponge;

import java.util.function.Function;

/*
* String s = "林青霞,30";
* 请按照指定的要求进行操作:
* 1.将字符串截取得到数字年龄部分
* 2.将上一步的年龄字符串转换成int类型的数据
* 3.将上一步的int数据加70,得到一个int结果,在控制台输出
* 请通过Function接口来实现函数拼接
* */
public class FunctionTest {
public static void main(String[] args) {
String s = "林青霞,30";
// convert(s,(String ss)->{
// return s.split(",")[1];
// },(String ss)->{
// return Integer.parseInt(ss);
// },(Integer i) ->{
// return i + 70;
// });
// convert(s,ss->ss.split(",")[1],ss->Integer.parseInt(ss),i -> i + 70);
convert(s,ss->ss.split(",")[1],Integer::parseInt,i -> i + 70);
}

private static void convert(String s, Function<String,String> fun1,Function<String,Integer> fun2,Function<Integer,Integer> fun3){
//Integer i = fun1.andThen(fun2).andThen(fun3).apply(s);
int i = fun1.andThen(fun2).andThen(fun3).apply(s);
System.out.println(i);
}
}