|
| 16 | IntBinaryOperator
接受两个参数同为类型int,返回值类型也为int 。
|
| 17 | IntConsumer
接受一个int类型的输入参数,无返回值 。
|
| 18 | IntFunction
接受一个int类型输入参数,返回一个结果 。
|
| 19 | IntPredicate
:接受一个int输入参数,返回一个布尔值的结果。
|
| 20 | IntSupplier
无参数,返回一个int类型结果。
|
| 21 | IntToDoubleFunction
接受一个int类型输入,返回一个double类型结果 。
|
| 22 | IntToLongFunction
接受一个int类型输入,返回一个long类型结果。
|
| 23 | IntUnaryOperator
接受一个参数同为类型int,返回值类型也为int 。
|
| 24 | LongBinaryOperator
接受两个参数同为类型long,返回值类型也为long。
|
| 25 | LongConsumer
接受一个long类型的输入参数,无返回值。
|
| 26 | LongFunction
接受一个long类型输入参数,返回一个结果。
|
| 27 | LongPredicate
R接受一个long输入参数,返回一个布尔值类型结果。
|
| 28 | LongSupplier
无参数,返回一个结果long类型的值。
|
| 29 | LongToDoubleFunction
接受一个long类型输入,返回一个double类型结果。
|
| 30 | LongToIntFunction
接受一个long类型输入,返回一个int类型结果。
|
| 31 | LongUnaryOperator
接受一个参数同为类型long,返回值类型也为long。
|
| 32 | ObjDoubleConsumer
接受一个object类型和一个double类型的输入参数,无返回值。
|
| 33 | ObjIntConsumer
接受一个object类型和一个int类型的输入参数,无返回值。
|
| 34 | ObjLongConsumer
接受一个object类型和一个long类型的输入参数,无返回值。
|
| 35 | Predicate
接受一个输入参数,返回一个布尔值结果。
|
| 36 | Supplier
无参数,返回一个结果。
|
| 37 | ToDoubleBiFunction<T,U>
接受两个输入参数,返回一个double类型结果
|
| 38 | ToDoubleFunction
接受一个输入参数,返回一个double类型结果
|
| 39 | ToIntBiFunction<T,U>
接受两个输入参数,返回一个int类型结果。
|
| 40 | ToIntFunction
接受一个输入参数,返回一个int类型结果。
|
| 41 | ToLongBiFunction<T,U>
接受两个输入参数,返回一个long类型结果。
|
| 42 | ToLongFunction
接受一个输入参数,返回一个long类型结果。
|
| 43 | UnaryOperator
接受一个参数为类型T,返回值类型也为T。
|
除了上面列出的,还有个别函数接口没列出来,例如Comparator(), 但总归是个函数接口都会基于FunctionalInterface注解
总结
这些函数主要还是分为几个主要函数,其余都是以其为基础的分化;
-
Supplier 无参数,返回一个结果。
-
Consumer 代表了接受一个输入参数并且无返回的操作。
-
Function<T,R> 接受一个输入参数,返回一个结果,返回的结果跟参数的类型无关。
-
Predicate 接受一个输入参数,返回一个布尔值结果。
-
BinaryOperator 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果,xxxOperator 函数都是接受类型跟返回值类型相同。
而且,从上面五个主要函数接口命名也可以看出其作用,"Bi"作为前缀的都是属于二元操作,接受两个参数。
T1to_T2_是从接受T1类型参数,返回T2类型结果,比如IntToLongFunction 接受一个int类型参数,返回long类型结果。
实战1
下面我写了一个功能,拳击手有分组跟体重两个属性,然后给一组拳击手集合,根据小组或者体重级排序,用到的是Comparator(),也是一个函数接口
上码:
-
/**
-
* Created by zhanghe
-
* 拳击手
-
*/
-
public class Boxer {
-
//分组
-
private String group;
-
//重量级
-
private Integer weight;
-
public Boxer(String group, Integer weight) {
-
this.group = group;
-
this.weight = weight;
-
}
-
public static <T> List<List<T>> divider(List<T> datas, Comparator<T> c) {
-
//声明一个列表来接收各个分组
-
List<List<T>> list = new ArrayList<>();
-
for (T t : datas) {
-
//通过isSameGroup 标识来判断分组是否已创建
-
boolean isSameGroup = false;
-
for (int i = 0; i < list.size(); i++) {
-
//compare函数返回值为int,正数说明param1>param2,0说明param1=param2,负数说明param1<param2
-
//这里用到的原理是将List列表datas中的各项与分组列表list中的元素比较(比较的规则由外面作为参数传递,这就是函数式编程),
-
// 值为0表示规则相符即为同一组
-
if (c.compare(t, list.get(i).get(0)) == 0) {
-
isSameGroup = true;
-
list.get(i).add(t);
-
break;
-
}
-
}
-
//比较完了发现没有规则相符的,即自成一系
-
if (!isSameGroup) {
-
List<T> e = new ArrayList<>();
-
e.add(t);
-
list.add(e);
-
}
-
}
-
return list;
-
}
-
public static void main(String[] args) {
-
List<Boxer> boxers = Arrays.asList(
-
new Boxer("红队", 120),
-
new Boxer("绿队", 180),
-
new Boxer("蓝队", 200),
-
new Boxer("绿队", 220),
-
new Boxer("蓝队", 120),
-
new Boxer("红队", 80),
-
new Boxer("红队", 90),
-
new Boxer("绿队", 240)
-
);
-
List<List<Boxer>> dividByGroup = divider(boxers, new Comparator<Boxer>() {
-
@Override
-
public int compare(Boxer o1, Boxer o2) {
-
//分组一样 即认为 相同
-
return o1.group.equals(o2.group) == true ? 0 : 1;
-
}
-
});
-
System.out.println("根据小组区分:");
-
dividByGroup.stream().forEach(e->{
-
System.out.println(e);
-
});
-
List<List<Boxer>> dividByWeight = divider(boxers, new Comparator<Boxer>() {
-
@Override
-
public int compare(Boxer o1, Boxer o2) {
-
//体重/100 即体重百分位相同 即认为 相同
-
return (o1.weight / 100 - o2.weight / 100) == 0 ? 0 : 1;
-
}
-
});
-
System.out.println("根据体重区分:");
-
dividByWeight.stream().forEach(e->{
-
System.out.println(e);
-
});
-
}
-
@Override
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
搜集费时费力,能看到此处的都是真爱!
});
-
}
-
@Override
言尽于此,完结
无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。
- 第一,设计模式能让专业人之间交流方便,如下:
程序员A:这里我用了XXX设计模式
程序员B:那我大致了解你程序的设计思路了
- 第二,易维护
项目经理:今天客户有这样一个需求…
程序员:明白了,这里我使用了XXX设计模式,所以改起来很快
- 第三,设计模式是编程经验的总结
程序员A:B,你怎么想到要这样去构建你的代码
程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题
- 第四,学习设计模式并不是必须的
程序员A:B,你这段代码使用的是XXX设计模式对吗?
程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的
[外链图片转存中…(img-TI3jbKrh-1714322526101)]
从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!
[外链图片转存中…(img-S1luakRH-1714322526101)]
搜集费时费力,能看到此处的都是真爱!