JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上,而Java8又新增了默认的函数接口,废话不多说,直接上代码:
/**
* consumer接口:对输入的参数进行操作,有输入,但是没有输出
* @author maye_C
*
*/
public class ConsumerDemo {
public static void main(String[] args) {
consumerTest();
}
private static void consumerTest() {
/**
* Consumer 接口表示执行在单个参数上的操作。
*/
Consumer<Integer> add = (v)->{
System.out.println("old value:" + v);
v += 5;
System.out.println("new value" + v);
};
//accept方法为Cousumer接口中的方法 void accept(T t);
add.accept(10);
}
}
对于consumer接口:我就多加分析了。各位老铁看注释就行,我 相信你们这么聪明肯定已经看懂了。
/**
* Function接口:接收一个参数,返回单一的结果,默认的方法(andthen)可以将多个函数串在一起,形成符合Function(有输入,有输出)结果。
*
* @author maye_C
*
*/
public class FunctionDemo {
public static void main(String[] args) {
//引用实例
Function<String, Integer> toInteger = Integer::valueOf;
//toInteger的执行结果作为第二个backString的输入
Function<String, String> backString = toInteger.andThen(String::valueOf);
//apply方法表示接收具体的值为参数
String result = backString.apply("123");
System.out.println(result);
Function<Integer, Integer> add = i->{
System.out.println("first input:" + i);
return i;
};
Function<Integer, Integer> zero = add.andThen((i)->{
System.out.println("second input:"+i);
return i*0;
});
//零/any=0
Integer res = zero.apply(10);
System.out.println(res);
}
}
下面是Predicate接口
Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非)
/**
* Predicate :输入一个参数,返回一个boolean值,内置了许多用于逻辑判断的方法
* @author maye_C
*
*/
public class PredicateDemo {
public void predicateTest() {
Predicate<String> str = (s)->s.length()>8;
boolean testResult = str.test("lambda");
System.out.println(testResult);
// 取反
testResult = str.negate().test("lambda");//即s.length()<=8
System.out.println(testResult);
//-----------------------------------------------
Predicate<Object> predicateObj = Objects::nonNull;
Object obj = null;
//判断是否为空
testResult = predicateObj.test(obj);
System.out.println(testResult);//false
/*下面的其他api我就不演示了,读者可以自行带入*/
Predicate<Boolean> isNull = Objects::isNull;
Predicate<String> isEmpty = String::isEmpty;
Predicate<String> isNotEmpty = isEmpty.negate();
}
@Test
public void fun1() {
predicateTest();
}
}
Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数
/**
* Supplier接口:返回一个给定类型的接口,不需参数,无输入,有输出
* @author maye_C
*
*/
public class SupplierDemo {
@Test
public void fun1() {
supplierTest();
}
private void supplierTest() {
// TODO Auto-generated method stub
//输出的结果为在泛型中自己指定的类
Supplier<String> supplierStr = ()->"输出结果为字符串";
String s = supplierStr.get();
System.out.println(s);
}
}
Optional 接口
Optional 不是函数是接口,这是个用来防止NullPointerException异常的辅助类型,这是下一届中将要用到的重要概念,现在先简单的看看这个接口能干什么:
Optional 被定义为一个简单的容器,这是一个值可为null的容器对象,如果值存在,isPresent方法会返回true,调用get方法会返回该对象。其值可能是null或者不是null。在Java 8之前一般某个函数应该返回非空对象但是偶尔却可能返回了null,而在Java 8中,不推荐你返回null而是返回Optional。
optional.isPresent(); // true
optional.get(); // "meinv"
optional.orElse("fallback"); // "mm",如果不为null,orElse方法返回Optional实例的值,如果为null,返回传入的值。
optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "m"
Optional接口中除了这几个方法外还有其他方法:比如orElseGet、orElseThrow等,时间有限,在这里就不多加介绍了。
读到这里,大家是不是发现了还有一个Stream串口没有介绍,后面再补吧!或者会单独放在一篇博文介绍。