java.util.function包中是通用性函数接口,它满足一下几种基本的使用。
函数型T ->R,完成参数类型T向结果类型R的转换。核心函数接口Function、operater
判断型T->boolean,核心函数接口Predicate
消费型T->void,核心函数接口Consumer
供给型void->T,核心函数接口Supplier
同时也有单参数和双参数之分,前缀加”bi”是双参数,前缀不加或加”Unary”的是单参数。
使用function保重的通用函数接口,在业务中基本可以不用再创建函数接口了。Function中的函数接口如下
类别 | 小类别 | 介绍 | 接口 |
---|---|---|---|
function | function | 有参数,有返回值,参数和返回值类型自定,可不同 | Function BiFunction DoubleFunction DoubleToIntFunction DoubleToLongFunction IntFunction IntToDoubleFunction IntToLongFunction LongFunction LongToDoubleFunction LongToIntFunction ToDoubleBiFunction ToDoubleFunction ToIntBiFunction ToIntFunction ToLongBiFunction ToLongFunction |
operator | 继承function,为参数、返回值类型都相同的function | BinaryOperator DoubleBinaryOperator DoubleUnaryOperator IntBinaryOperator IntUnaryOperator LongBinaryOperator LongUnaryOperator UnaryOperator | |
Perdicate | 返回boolean值,判断 | Predicate BiPredicate DoublePredicate IntPredicate LongPredicate | |
Supplier | 生产者,不带任何参数 | Supplier BooleanSupplier DoubleSupplier IntSupplier LongSupplier | |
Consumer | 消费者,没有任何返回值 | Consumer BiConsumer DoubleConsumer IntConsumer LongConsumer ObjDoubleConsumer ObjIntConsumer ObjLongConsumer |
Function的通用函数接口满足的大部分的需求,直接实现通用函数接口就好。下面是函数接口的示例。这些示例包含了Predicate、BiConsumer、BiFunction、BinaryOperator、DoubleFunction、DoubleUnaryOperator、DoubleConsumer、DoubleSupplier。
public class FunctionPackageTest {
@Test
public void evenNumTest() {
List<Integer> numlist = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
printEvenNum(numlist, (Integer a) -> {
return a % 2 == 0;
});
}
/**
* Predicate实现求偶数
*/
public void printEvenNum(List<Integer> numlist, Predicate<Integer> evenNumPredicate) {
for (Integer num : numlist) {
if (evenNumPredicate.test(num)) {
System.out.println(num);
}
}
}
@Test
public void stringAddIntegerTest() {
Integer in = 3;
String us = "5";
printStringAddInteger(in, us, (String u, Integer i) -> {
System.out.println("i+u=" + (i + Integer.valueOf(u)));
});
}
/**
* Consumer实现加法运算
*/
public void printStringAddInteger(int i, String u, BiConsumer<String, Integer> biConsumer) {
biConsumer.accept(u, i);
}
@Test
public void returnStringAddIntTest() {
Integer result = returnStringAddInt(3, "5", (String st, Integer in) -> {
return in + Integer.valueOf(st);
});
System.out.println("result:" + result);
}
/**
* Function实现带返回值的加法运算
*/
public Integer returnStringAddInt(int i, String u, BiFunction<String, Integer, Integer> biConsumer) {
return biConsumer.apply(u, i);
}
@Test
public void returnStringAddTest() {
System.out.println("result:" + returnStringAdd("1", "2", (a, b) -> {
return String.valueOf(Integer.valueOf(a) + Integer.valueOf(b));
}));
}
/**
* Operator实现两个参数、返回值类型相同的加法运算
*/
public String returnStringAdd(String a, String b, BinaryOperator<String> binaryOperator) {
return binaryOperator.apply(a, b);
}
@Test
public void returnDateStringTest() {
returnDateString(() -> {
return new Random().nextInt(10);
});
}
/**
* supplier模拟抽奖系统
*/
public void returnDateString(Supplier<Integer> supplier) {
Integer caipiao = 5;
Integer kaijiancaipiao = supplier.get();
System.out.println("开奖数字:" + kaijiancaipiao);
switch (Math.abs(caipiao - kaijiancaipiao)) {
case 0:
System.out.println("一等奖");
break;
case 1:
System.out.println("二等奖");
break;
case 2:
System.out.println("三等奖");
break;
default:
System.out.println("没有中奖");
}
}
@Test
public void doubleFunctionTest() {
String result = doubleFunction(3.0, (double a) -> {
return a + "xxx";
});
}
//DoubleFunction的案例
public String doubleFunction(Double param, DoubleFunction<String> doubleFunction) {
String result = doubleFunction.apply(param);
return result;
}
@Test
public void toDoubleBiFunctionTest() {
Double result = toDoubleBiFunction("12", (byte) '1', (s, b) -> {
return Double.valueOf(Integer.valueOf(s) - Integer.valueOf(b));
});
System.out.println("result:" + result);
}
//ToDoubleBiFunction的案例
public Double toDoubleBiFunction(String ss, Byte bb, ToDoubleBiFunction<String, Byte> toDoubleBiFunction) {
Double result = toDoubleBiFunction.applyAsDouble(ss, bb);
return result;
}
@Test
public void doubleUnaryOperatorTest() {
Double result = doubleUnaryOperator(3.9, (a) -> {
return a + 1;
});
System.out.println("result:" + result);
}
//DoubleUnaryOperator的案例
public Double doubleUnaryOperator(double s, DoubleUnaryOperator doubleUnaryOperator) {
Double result = doubleUnaryOperator.applyAsDouble(s);
return result;
}
@Test
public void doubleConsumerTest() {
doubleConsumer(3.4, (d) -> {
System.out.println(d + 1.0);
});
}
//DoubleConsumer的案例
public void doubleConsumer(Double d, DoubleConsumer doubleConsumer) {
doubleConsumer.accept(d);
}
@Test
public void doubleSupplierTest() {
Double result = doubleSupplier(()->{
return 2.4;
});
System.out.println("result:" + result);
}
//DoubleSupplier的案例
public Double doubleSupplier(DoubleSupplier doubleSupplier) {
Double result = doubleSupplier.getAsDouble();
return result;
}
}