jvm学习——Lambda表达式和函数式编程接口——丑九怪

JVM学习——Lambda表达式和函数式编程接口——丑九怪

    • 函数式编程接口
        • Supplier接口
        • Consumer接口
        • Function接口
        • Predicate接口
    • 自己实现简单函数式编程接口并使用

在jdk1.8中提出了Lambda表达式和函数式编程接口,在看源码的过程中遇到很多,这里总结一些常见的函数编程式接口和Lambda表达式的语法以及实现

函数式编程接口

这里只介绍几种经常使用和在源码中经常出现的

Supplier接口

  • 无参数,有一个返回值。基本用法如下
Supplier supplier = () -> {  // 泛型部分表示参数类型,后面的括号中没有东西,表示无参
    return "Supplier" + "你好"; // 这里相当于函数体,具体的逻辑在这里完成,很明显,这是一个返回值为String的函数
};
System.out.println(supplier.get()); // 这相当于调用上面所写好的函数,可以将上面的函数理解为一个匿名函数

在这里插入图片描述

Consumer接口

  • 这个接口中除了最基本的调用方法:accept()之外,还有一个default方法:
    • Consumer andThen(Consumer after),这个方法用发如下
Consumer consumer = (x) -> {  // 先定义第一个函数
	System.out.println("Consumer" + "你好" + x);
};
Consumer strConsumer = (x) -> { // 定义第二个函数
    System.out.println("andThen" + x);
};
consumer.andThen(strConsumer).accept("梅西");、// 这里先调用andThen方法,参数为第二个函数
				// 再调用accept方法,参数为字符串“梅西”

在这里插入图片描述
上面的代码先执行了第一个函数的内容,转而执行第二个函数的内容,参数都是accept方法传入的参数

Function接口

  • 一个参数,一个返回值。接口中除了最基本的调用方法apply(T t)之外,还有两个default方法和一个static方法:
    • default Function compose(Function before)
    • default Function andThen(Function after)
    • static Function identity()
Function function = (x) -> { // 两个泛型,第一个是参数类型,第二个是返回值类型
System.out.println(x);
    return x;
};
function.andThen(function).apply("++++++++++++++++"); // 这个方法是先执行apply中的,在执行andThen中的
// compose方法同理,先执行compose方法中的,再执行apply中的
Function strFunction = Function.identity(); // 这个方法相当于Function的默认实现方式
System.out.println(strFunction.apply("Function" + "你好"));

在这里插入图片描述
前两个输出不必多说,最后一个identity()方法做下说明,他的内部实现是直接将参数返回,相当于一个默认实现方式

Predicate接口

  • 一个参数,返回值为boolean,除了最基本的调用方法test()之外,还有三个default方法和一个static方法:
    • default Predicate and(Predicate other)
    • default Predicate negate()
    • default Predicate or(Predicate other)
    • static Predicate isEqual(Object targetRef)
Predicate intPredicate = (x) -> {  // 这是第一个函数实现
	return x == 110;      // 相当于和110比较,返回一个boolean
};
Predicate intPredicateTwo = (x) -> {// 这是第二个函数实现
    return x == 120;
};
System.out.println(intPredicate.test(110));     // 直接调用test,传参相当于用110和第一个函数中的110进行比较

System.out.println(intPredicate.or(intPredicateTwo).test(120));  // 这个or方法类似于或逻辑,参数为120,
					// 传递过程是:先将120传入第一个函数,返回一个boolean,再将120传入的第二个函数,得到结果后
					// 两个逻辑值进行或运算得到结果
Predicate predicate = Predicate.isEqual(110); // 这个静态方法相当于直接设置了需要进行比较的值,在后续
				// 的调用的过程中直接用test中的参数和.isEqual中的参数进行比较
System.out.println(predicate.test(10));

自己实现简单函数式编程接口并使用

@FunctionalInterface
public interface FunctionInterFace {
    boolean test(T t);
}
  • 上面是简单的实现,应用如下
FunctionInterFace  stringFunctionInterFace = (x) -> {
	return x.equals("1");
};
System.out.println(stringFunctionInterFace.test("1"));

你可能感兴趣的:(jvm学习——Lambda表达式和函数式编程接口——丑九怪)