@FunctionalInterface注解可以判断编写的函数式接口是否正确;
supplier提供者;
consumer消费者;
function函数;
operation运算符;
binary二元;
这些单词是理解Java四大基础函数接口需要记住的单词;
函数接口是一段行为的抽象,简单说是在方法中将一段行为作为参数进行传递,这个行为是一段代码,也可以是一个方法,函数接口就是对匿名内部类的优化;
package day24_FunctionFour;
import java.util.function.Predicate;
public class PredicateTestOne {
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 构造方法 生产对象
*/
PredicateTestOne predicateTestOne = new PredicateTestOne();
/**
* 匿名内部类
*/
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String t) {
// TODO Auto-generated method stub
return t.equals("zhangsan");
}
};
System.out.println(predicate.test("list"));
System.out.println("--------------------");
System.out.println(predicate.test("zhangsan"));
}
}
在Java中函数式编程体现就会死Lambda,所以函数式接口也可以说是适用于Lambda使用的接口,只有确保接口中只有一个抽象方法,Lambda才能进行推导;
Funciton<T,R>接口,是接受一个T类型的参数,返回一个R类型的结果的方法的抽象,通常调用appley方法执行内容;
package day24_FunctionFour;
import java.util.function.Function;
public class Operation {
/**
* 下面这个方法接收一个int'类型的参数,返回a+1
* 这个方法符合function<R,T>接口的定义
* @param args
*/
public static final int addOne(int a) {
return a+1;
}
/**
* 该方法第二个参数接收一个funcation类型的行为,
* 然后调用apply,
* 对a执行这段行为
* @param args
*/
public static int oper(int a ,Function<Integer, Integer> action) {
return action.apply(a);
}
/**
* 下面调用oper方法,将addOne作为参数传递
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 1;
// 这里可以缓存方法的引用int y = oper(x,Operation::addOne)
int y = oper(x,a->addOne(a));
System.out.println("x="+x+",y="+y);
// 我们可以使用lambda表达式来表示这段行为,只要一个参数,一个返回值就能匹配
y = oper(x, a->a+3);
System.out.println(y);
y = oper(x, a->a+4);
System.out.println(y);
}
}
Consumer接口,就是消费者接口,该接口对应的方法类型为接收一个参数,没有返回值,forEach就是使用的Consumer接口;
package day24_FunctionFour;
import java.util.function.Consumer;
public class Consumer_ {
public static void main(String[] args) {
// TODO Auto-generated method stub
Consumer<String> printString = s->System.out.println(s);
printString.accept("HelloWorld");
}
}
Supplier接口,就是生产者接口,该接口对应的方法类型不接受参数,但是提供一个返回值,使用get()方法可以获得这个返回值;
package day24_FunctionFour;
import java.util.function.Supplier;
public class Supplier_ {
public static void main(String[] args) {
// TODO Auto-generated method stub
Supplier<String> getInstance = ()->"HelloWorld";
System.out.println(getInstance.get());
}
}
Predicate<T,Boolean>,断言接口对应的方法接收一个参数,返回一个Boolean类型值,使用test()方法执行,多见于判断和过滤;
package day24_FunctionFour;
import java.util.function.Predicate;
public class Predicate_ {
public static void main(String[] args) {
// TODO Auto-generated method stub
Predicate<Integer> predOdd = integer->integer%2==1;
System.out.println(predOdd.test(5));
}
}
package day24_FunctionFour;
public class PredicateTestTwo {
public static void main(String[] args) {
// TODO Auto-generated method stub
PredicateTestTwo predicateTestTwo = new PredicateTestTwo();
System.out.println(predicateTestTwo.judgeStringLength("hello"));
System.out.println(predicateTestTwo.judgenumbersOdds(4));
System.out.println(predicateTestTwo.judgeSpecialNumbers(-1));
}
/**
* 判断传入的字符串长度是否大于5
* @param judgeString
* @return
*/
public boolean judgeStringLength (String judgeString) {
return judgeString.length()>5?true:false;
}
/**
* 判断传入的参数是否是奇数
* @param number
* @return
*/
public int judgenumbersOdds(int number) {
return number % 2 == 0 ? 1 : 0;
}
/**
* 判断数字是否大于10
* @param number
* @return
*/
public int judgeSpecialNumbers(int number) {
return number>10?1:0;
}
}
package day24_FunctionFour;
import java.util.function.Predicate;
public class PredicateTestThree {
public static void main(String[] args) {
// TODO Auto-generated method stub
PredicateTestThree predicateTestThree = new PredicateTestThree();
System.out.println(predicateTestThree.judgeConditionByFunction(12345, value->String.valueOf(value).length()>5));
}
/**
*
* @param value
* @param predicate
* @return
*/
public boolean judgeConditionByFunction(int value,Predicate<Integer> predicate) {
return predicate.test(value);
}
}