观察在JDK1.8之中提供的新的函数式接口包以及提供的四个函数式接口。
方法引用都需要定义一个函数式接口,可是不管如何操作,实际上有可能操作的接口只有四种,在JDK1.8提供了一个包java.util.function,提供有以下四个核心接口。
1.功能性接口(Function)
public interface Function<T,R>{public R apply(T t);}
此接口需要接收一个参数,并且返回一个处理结果
2.消费型接口(Consumer)
public interface Consumer<T>{public void accept(T t);}
此接口只是负责接收数据(引用数据是不需要返回的),并且不返回处理结果。
3.供给型接口(Supplier)
public interface Suppiler<T>{public T get();}
此接口不接收参数,但是返回结果。
4.断言型接口(Predicate)
public interface Predicate<T>{public boolean test(T t)}
进行判断操作使用
所有在JDK1.8之中,由于存在以上四个功能型接口,所以一般很少会由用户去定义新的函数是接口
范例:观察功能型接口——接收参数并且返回一个处理结果。
String类有一个方法:public boolean startsWith(String str)
package TestDemo;
import java.util.function.Function;
public class TestDemo{
public static void main(String[] args) {
Function<String,Boolean> fun="##hello"::startsWith;//方法引用赋给一个函数式接口
System.out.println(fun.apply("##"));
}
}
方法引用赋予一个函数式接口,最终的判断其实是"##hello".startsWith"##";这个语句。答案为true
范例:消费型接口
package TestDemo;
import java.util.function.Consumer;
import java.util.function.Function;
class MyDemo{
public void print(String str){//此方法没有返回值,但是有参数
System.out.println(str);
}
}
public class TestDemo{
public static void main(String[] args) {
Consumer<String> cons=new MyDemo()::print;//方法引用赋给一个函数式接口
cons.accept("Hello World!");
}
}
范例:供给型接口(Supplier)
引用String类中的toUpperCase()方法
public String toUpperCase();
package TestDemo;
import java.util.function.Supplier;
public class TestDemo{
public static void main(String[] args) {
Supplier<String> sup="hello"::toUpperCase;//方法引用赋给一个函数式接口
System.out.println(sup.get());
}
}
结果"hello
范例:断言型接口(Predicate)
String类中有一个equalsIgnoreCase()方法
package TestDemo;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class TestDemo{
public static void main(String[] args) {
Predicate<String> pre="hello"::equalsIgnoreCase;//方法引用赋给一个函数式接口
System.out.println(pre.test("hello"));//不区分大小写判断是否相等
}
}
答案为true
总结:
开发中所用到的函数式接口一般都为以上4种,所有讲的这一切都要为最后的数据流做准备。
网友评论