你之因此能优于别人,正是由于你坚持了别人所不能坚持的。
本文相关代码在个人Github,欢迎Star~
https://github.com/zhangzhibo1014/DaBoJava
Lambda
是一个匿名函数,是一个可传递的代码块,能够在之后执行一次或屡次。使用 Lambda
表达式,能够写出更加紧凑、更加简洁、更加灵活的代码。java
(parameters) -> expression (parameters) -> { statements; } (参数) -> 方法体(表达式/代码块)
Lambda
并非任何地方均可以使用,Lambda
表达式须要“函数式接口”的支持。git
接口中只有一个抽象方法的接口,称为函数式接口,能够用 @FunctionalInterface
修饰一下,这里须要注意的是:未使用 @FunctionalInterfaces
注解的接口未必就不是函数式接口,一个接口是否是函数式接口的条件只有一条,即接口中只有一个抽象方法的接口( Object
类中的方法不算)。而使用 @FunctionalInterface
注解修饰了的接口就必定是函数式接口,添加 @FunctionalInterface
注解能够帮助咱们检查是不是函数式接口。github
Consumer<T> : 消费型接口(无返回值,有去无回) void accept(T t); Supplier<T> : 供给型接口 T get(); Function<T,R> : 函数型接口 R apply(T t); Predicate<T> : 断言型接口 boolean test(T t); 四大核心接口的-->扩展子接口 @FunctionalInterface public interface Runnable { public abstract void run(); } @FunctionalInterface public interface Supplier<T> { T get(); } @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } } 其余的相似,这些函数式接口都在java.util.function包下,读者可去这个包下去查询。
1.不须要参数 () -> 5 2.接收一个参数 x -> x * 2 3.接收两个参数 (int x, int y) -> x * y (x, y) -> x - y 4.接收一个 String 对象 (String s) -> System.out.println(s)
/** * lambda表达式 */ public class Demo { public static void main(String[] args) { Demo demo = new Demo(); // 表达式 Cal addCal = (x, y) -> x + y; Cal subCal = (int x, int y) -> {return (x - y); }; Cal mulCal = (x, y) -> x * y; Cal divCal = (int x, int y) -> x / y; System.out.println("10 + 2 =" + demo.cals(10, 2, addCal)); System.out.println("10 - 2 =" + demo.cals(10, 2, subCal)); System.out.println("10 * 2 =" + demo.cals(10, 2, mulCal)); System.out.println("10 / 2 =" + demo.cals(10, 2, divCal)); } public static int cals(int a, int b, Cal cal) { return cal.calNumbers(a,b); } } interface Cal{ int calNumbers(int a, int b); }
方法也是一种对象,能够经过名字来引用。不过方法引用的惟一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能经过方法引用来得到诸如方法签名的相关信息。express
方法引用能够经过方法的名字来引用其自己。方法引用是经过::
符号(双冒号)来描述的。微信
import java.util.function.Consumer; import java.util.function.Supplier; /** * 方法引用 */ public class Demo1 { public static void main(String[] args) { //构造方法 Supplier<DaBoJava> supplier = DaBoJava::new; System.out.println(supplier.get()); //静态方法 Consumer<String> consumer = DaBoJava::staticMethod; consumer.accept("DaBoJava"); //对象方法 DaBoJava daBoJava = new DaBoJava(); Consumer<String> consumer1 = daBoJava::method; consumer1.accept("instance"); } } class DaBoJava{ public DaBoJava() { } public static void staticMethod(String name) { System.out.println(name); } public void method(String name){ System.out.println(name); } }
Lambda
虽然代码看上去简洁,可是若是复杂的话仍是比较难看明白的。app
在学习 Lambda
的时候,咱们应该清楚有哪些常见的函数式接口,而且了解相应的函数式接口的用法(参数,返回值类型)函数
Lambda
表达式返回的是 接口对象实例 ,若是 函数式接口的实现刚好能够经过调用一个方法来实现 ,那么咱们可使用方法引用来替代Lambda表达式学习
相关代码记录于 GitHub中,欢迎各位伙伴 Star !有任何疑问 微信搜一搜 [程序猿大博] 与我联系~ui
若是以为对您有所帮助,请 点赞 ,收藏 ,若有不足,请评论或私信指正,谢谢~code