重庆大型网站建设重庆网站制作,建网站内容,企业制作网站一般多少钱,h网站模版一.什么是行为参数化呢 说白了就是将一段行为当作参数传入一个方法中呗#xff0c;那么这段行为是什么呢#xff1f; 答#xff1a;那也是一个方法咯。 Java在1.8版本引入了行为参数化的概念#xff0c;首先#xff0c;我们先看一小段代码 public class test { public sta…一.什么是行为参数化呢 说白了就是将一段行为当作参数传入一个方法中呗那么这段行为是什么呢 答那也是一个方法咯。 Java在1.8版本引入了行为参数化的概念首先我们先看一小段代码 public class test { public static void main(String[] args){ Consumer consumer new Consumer() { Override public void accept(String s) { System.out.println(s); } }; show(consumer ,hello world);
}public static void show(ConsumerString consumer,String text){consumer.accept(text);
}
复制代码 } 输出结果当然是hello world 啦。 可是你想这有什么呢不就是写了一个Consumer接口然后写一个匿名类重写他的accept方法然后带入Consumer到show方法调用它咩Java没更新前也可以这样啊只不过是传参了一个对象然后在方法内调用了对象的方法。 那么我们再来看看下面这段代码看看它和上面的代码有什么不同 public class test { public static void main(String[] args){ /Consumer consumer new Consumer() { Override public void accept(String s) { System.out.println(s); } };/ show(System.out::println ,hello world);
}public static void show(ConsumerString consumer,String text){consumer.accept(text);
}
复制代码 } 注意代码中3到8行已经注释了哦。 现在看看:show方法接受一个Consumer对象和字符串然后调用对象的accept方法这里都没变可是著方法中调用show方法的时候传递的第一个参数不再是Consumer对象了而是System.out::println而这是什么意思呢 System.out::println 是方法引用方法引用的格式就是类名::方法名 或者 对象名::成员方法名 我们都知道在方法重写和重载中我们是怎么做的呢在子类中写一个和主类中被重写方法方法名相同、参数类型、顺序相同的方法那jdk是根据什么来判断是否是重写或者重载呢没错就是靠函数签名来判断的就比如上面代码中的show方法它的函数签名就是名为show、接受两个参数并且第一个参数是Consumer类型、第二个参数是String类型的函数如果返回类型相同则是重写否则是重载。Java根据你的方法引用来确定你的方法签名和返回类型如果和形参中Consumer对象中的方法相同的话就可以使用。 那么我们回到代码中去我们在主方法中调用show方法时传入的第一个参数就是一个无返回值接受一个泛型参数的方法签名的方法引用。 你也可以传入其他方法进去只要方法签一致就可以啦。就像下面一样 public class test { public static void main(String[] args){ /Consumer consumer new Consumer() { Override public void accept(String s) { System.out.println(s); } };/ test one new test(); show(one::otherMethod ,hello world);
}public void otherMethod(T t){int i 0;System.out.println(i t.toString());
}public static void show(ConsumerString consumer,String text){consumer.accept(text);
}
复制代码 } 结果是输出0hello world 你也可以将show方法的第二个参数换成一个集合然后在第一个参数中传入其他方法引用来对集合进行操作哦。 在上面我们说到在带哦用show方法时传入的方法引用的方法签名、返回类型要和Consumer对象中方法的一致那么这个Consumer到底是什么呢它的内部只有一个方法吗如果有多个方法的话怎样根据传入的方法引用和他的众多方法比较呢 答Consumer其实是一个接口一个函数式接口话不多说直接上源码 package java.util.function; import java.util.Objects; FunctionalInterface public interface Consumer { void accept(T t);default ConsumerT andThen(Consumer? super T after) {Objects.requireNonNull(after);return (T t) - { accept(t); after.accept(t); };
}
复制代码 } 大家看是不是感觉有些不对呢Java接口明明不能所有实现方法的现在却多了一个default方法被实现嘿嘿这是Java8的新特性这个我会在之后的帖子中继续和大家分享。大家要注意的是FunctionalInterface这个注解它表明这个接口是一个函数式接口函数式接口的定义就是一个有且只有一个抽象方法但是可以有多个非抽象方法的接口。非抽象方法就是default方法可以有多个但是抽象方法只能有一个那么上面关于传入方法引用怎样匹配方法签名和返回值的疑问你们理解了吗 就是说在上面的例子中我在show方法定义的Consumer中只有一个抽象方法accept他是一个无返回值接受一个泛型参数的方法而我在调用show方法的时候也传入了和accept方法返回值一致参数相同的方法引用这就是方法重写在上面的例子中我传入System.out::println时就是无形之中创建了一个匿名类然后重写了他的accept方法重写的方法就是System.out.println()方法。神奇咩嘿嘿... 等等还没完...Consumer接口提供一个无返回值类型接受一个参数的抽象方法供大家使用那么如果我有其他需求呢假如我需要一个有返回值的抽象方法供我使用呢 别急Java提供了一系列函数式接口来供我们按照需求使用如果没有自己需要的接口的话我们也可以自己写一个函数式接口来使用。 函数式接口 函数描述符 Predicate T-boolean Consumer T-void FunctionT,R T-R Supplier ()-T UnaryOperator T-T BinaryOperator (T,T)-T BiPredicateL,R (L,R)-boolean BiConsumerT,U (T,U)-void BiFunctionT,U,R (T,U)-R 函数描述符是什么呢这就要说到Lambda表达式了在下一篇博客中我会讲解。本人是小白大学生一枚如有不对或者不当之处还请各位前辈指点嘿嘿 转载于:https://juejin.im/post/5c39af8a518825265c2fd86a