1.前言
这里面的内容,主要也是对jdk1.8的内容进行简要的说明。希望现在屏幕前的你能简单的了解到相对应的jdk1.8的内容信息
PS:注意,目前观察,发现JDK1.8的特性,并不是一个个独立的特点,而是在一个点上,一步又一步的静进。因此,如果你尚不理解之前的内容,那么请不要直接跳跃到下一个节点的内容。
2.匿名函数
要使用对应匿名函数的条件
- 对象必须是接口
- 接口只允许只有一个未编写的函数接口 , 允许拥有对应的default的方法
//目标仅仅只能为接口,不允许为抽象类
public interface MahincheTwo {
public int add( int x , int y); // 对应的匿名方法
public default int reduce( int x , int y){ // 允许拥有对应的 reduce
return x - y;
}
}
//匿名函数方式来直接进行获取对应的信息
MahincheTwo machineTwo = (x , y) -> x + y + 1;
3.函数式接口
如果,你暂时无法理解 函数式接口 这五个字的含义是什么 . 你可以把他们先看成接口,然后再把他们看成匿名函数规范接口
Comsumer < T >: 接受一个类型的参数,但是并不返回对应的结果值.
@FunctionalInterface
public interface Consumer<T> {
void accept(T t); //仅仅接受一个参数,但是并不会对参数进行返回的值
}
Function<T,M>: 可以理解为Consumer的精进类型,一样同样仅仅是接受一个参数,差别只在于会得到一个返回值的结果。T类型代表参数的类型,M代表返回值的类型
@FunctionalInterface
public interface Function<T, M> {
R apply(T t); //接受一个参数,但是会得到对应的参数结果
}
BiFunction<T,M,K>: 可以理解为BiFunction的精进类型,差别只在于接受参数的数量为两个 。
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
Supiler< T > : 这个类型并不与其他类型相关,他则是得到对应的object 。 得到对应的T的类型信息
我们可以将其看做如此,在obj上外套了一层外壳。他可以
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
3.2 Optional 容器
Optional< T > : 如果仅仅只是从使用角度来看待问题的话,optional 与 suplier 接口的使用方式其实是一样的。
它的设计出来的角度,也许是以下如此:
在过去的开发之中,我们常常会遇见这样的一个问题。我们得到几个参数的时候,但是,我们并不知道这个参数是不是存在,因此,我们常常会遇见这样解决方案。
public void test( String string ){
boolean exist = string != null;
//我们并不清楚这个参数是否存在,所以我们总有各自各样的方式,去尝试
}
4.方法引用
简单的说,我们上文中所说的函数式接口 . Jdk ,也可以看做Java官方,为上文一部分函数式接口专门的设计了一些特殊的编程方式。主要的主角也是 :: 符号。
如果大家知道C++的话,大家应该不会对这个双引号符号不陌生。他是链接类与方法的关系符号。
因此,Java也是如此,它主要表示类中的方法的关系,就如同映射之中的Method。
- Supplier< Class > supplier = Class::Method(类名,xx),效果如同生成实际类。 new ClassA(),并且 内部的构造函数的调用会在使用get之后.类才生成。
- targetObj::sayStr(实际深沉类,方法),如同得到目标方法的Method,然后直接调用方法,效果如同映射。
- Class::Method(类名,方法),效果如下,主要调用的也是静态方法。
PS:得到的结果,会根据对应方法的参数数量,返回结果的不同而不同,与静态不静态方法并没有关系。如同下文之中的sayStr( String str ) , 参数为1 并且返回结果为void , 因此对应上文之中的 Consumer . 因此使用Consumer。
PPS:由于Void无法替代void,因此不存在Function< String , Void > 等同于 Consumer< String > 这个情况。
public ClassA{
public static void staticSayStr( String str ){
System.out.println( str );
}
public static String staticSayObject( String strA , String strB){
StringBuilder builder = new StringBuilder();
builder.append( strA );
builder.append( strB );
return builder.toString();
}
public void sayStr( String str ){
staticSayStr( str );
}
public ClassA(){
System.out.println("success new one obj ");
}
public static void main( String args[]){
/*
1.类名::new , 效果如同生成实际类。 new ClassA();
并且 内部的构造函数的调用会在使用get之后,才生成。
*/
Supplier<ClassA> classASuppelier = ClassA::new;
//调用get()方法之后,ClassA 才成功的生成
ClassA targetObj = classASupplier.get();
//目标生成类名::方法名,如同得到目标方法的Method,然后直接调用方法,效果如同映射。
Consumer<String> classFunction = targetObj::sayStr;
//目标类名::方法名,也是直接调用对应的方法
BiFunction<String,String,String> biFunction = ClassA::staticSayObject;
}
}