Java8新特性探索之函数式接口( 三 )

输出结果:
张三的钱包原本只有500元 , 自驾川西得去银行再取1000元 , 取钱后张三钱包总共有1500元第一晚在成都住宿前有1500元交完200住宿费还剩余1300元第二天出发前发现油不足 , 加油前有1300元加油300后还剩余1000元到达景区门口 , 买景区票前有1000元买景区票290后还剩余710元第二晚在九寨县住宿前有710元交完200住宿费还剩余510元最后张三返程到家还剩余510元其他的函数型函数式接口汇总说明:
接口名称方法名称方法签名BiFunctionapply(T, U) -> RDoubleFunctionapply(double) -> RDoubleToIntFunctionapplyAsInt(double) -> intDoubleToLongFunctionapplyAsLong(double) -> longIntFunctionapply(int) -> RIntToDoubleFunctionapplyAsDouble(int) -> doubleIntToLongFunctionapplyAsLong(int) -> longLongFunctionapply(long) -> RLongToDoubleFunctionapplyAsDouble(long) -> doubleLongToIntFunctionapplyAsInt(long) -> intToDoubleFunctionapplyAsDouble(T) -> doubleToDoubleBiFunctionapplyAsDouble(T, U) -> doubleToIntFunctionapplyAsInt(T) -> intToIntBiFunctionapplyAsInt(T, U) -> intToLongFunctionapplyAsLong(T) -> longToLongBiFunctionapplyAsLong(T, U) -> long
断言型接口Predicate
java.util.function.Predicate 接口中包含一个抽象方法: boolean test(T t), 用于条件判断的场景 。 默认方法:and or nagte (取反) 。
接口源码:
package java.util.function;import java.util.Objects;@FunctionalInterfacepublic interface Predicate {boolean test(T t);default Predicate and(Predicate other) {Objects.requireNonNull(other);return (t) -> test(t)}default Predicate negate() {return (t) -> !test(t);}default Predicate or(Predicate other) {Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);}staticPredicate isEqual(Object targetRef) {return (null == targetRef)? Objects::isNull: object -> targetRef.equals(object);}}既然是条件判断 , 就会存在与、或、非三种常见的逻辑关系 。 其中将两个 Predicate 条件使用与逻辑连接起来实现并且的效果时,类始于 Consumer接口 andThen()函数 其他三个雷同 。
public class PredicateTest { /*** 查找在渝北的Jack*/ @Test public void findByPredicateTest() {List list = Lists.newArrayList(new User("Johnson", "渝北"), new User("Tom", "渝中"), new User("Jack", "渝北"));getNameAndAddress(list, (x) -> x.getAddress().equals("渝北"), (x) -> x.getName().equals("Jack")); }public void getNameAndAddress(List users, Predicate name, Predicate address) {users.stream().filter(user -> name.and(address).test(user)).forEach(user -> System.out.println(user.toString())); }}输出结果:
User [name=Jack, address=渝北]其他的断言型函数式接口汇总说明:
接口名称方法名称方法签名BiPredicatetest(T, U) -> booleanDoublePredicatetest(double) -> booleanIntPredicatetest(int) -> booleanLongPredicatetest(long) -> boolean
四、总结Lambda 表达式和方法引用并没有将 Java 转换成函数式语言 , 而是提供了对函数式编程的支持 。 这对 Java 来说是一个巨大的改进 , 因为这允许你编写更简洁明了 , 易于理解的代码 。