Java8 Lambda不仅仅只是语法糖
前端時間,項目升級到jdk1.8,嘗試了下Lambda寫法:
? ? public static void main(String[] args) {
? ? ? ? List<String> lst = Arrays.asList("bb", "aa", "dd", "cc", "ee");
? ? ? ? // Lambda前
? ? ? ? for (String a : lst) {
? ? ? ? ? ? System.out.println(a);
? ? ? ? } ??
? ? ? ? // Lambda后
? ? ? ? lst.forEach(a -> System.out.println(a));
? ? }
代碼是簡潔了些,但翻了翻源碼:
? ? default void forEach(Consumer<? super T> action) {
? ? ? ? Objects.requireNonNull(action);
? ? ? ? for (T t : this) {
? ? ? ? ? ? action.accept(t);
? ? ? ? }
? ? }
只是簡單地迭代,并沒有什么性能方面的優勢,反而lambda寫法,對于我想調試a的情況,卻會有諸多不便。
難道Lambda僅僅只是這么簡單的語法糖嗎?
舉個例子,Comparator接口:
? ? Collections.sort(lst, new Comparator<String>() {
? ? ? ? @Override
? ? ? ? public int compare(String o1, String o2) {
? ? ? ? ? ? return o1.compareTo(o2);
? ? ? ? }
? ? });
? ? lst.forEach(a -> System.out.println(a));
這種排序很常見,匿名類實現Comparator接口并重寫compare方法。
那Lambda可以怎樣寫呢?
? ? Collections.sort(lst, (o1, o2) -> {
? ? ? ? return o1.compareTo(o2);
? ? });
? ? lst.forEach(a -> System.out.println(a));
沒有了內部類,沒有了override,取而代之的是lambda實現的匿名方法。
對于像Comparator這樣,只有一個抽象方法的接口,java8中稱之為函數式接口(FunctionalInterface)。凡是使用函數式接口的內部類,都可以用lambda替代。
如此看來,lambda帶給我們的,不僅僅只是語法上的簡潔,而是一種新的編程方式,可以將函數當做參數傳遞,有點C#里面委托的意思。
再舉個例子,判斷角色類型:lambda以前,我們需要使用到匿名類,再重寫抽象方法check;有了lambda,可以使用“函數參數”輕松解決。
? ? public interface IRoleTypeChecker {
? ? ? ? // 角色類型判斷器
? ? ? ? boolean check(String roleType);
? ? }
? ? // 角色判斷私有方法
? ? private static boolean checkRole(String roleKey, IRoleTypeChecker roleTypeChecker) {
? ? ? ? if (roleTypeChecker.check(roleKey)) {
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? return false;
? ? }
? ? // 匿名類寫法
? ? public static boolean isCustomerLogon(String roleKey) {
? ? ? ? return checkRole(roleKey, new IRoleTypeChecker() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public boolean check(String roleType) {
? ? ? ? ? ? ? ? return RoleTypeUtil.isCustomer(roleType);
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? // lambda寫法
? ? public static boolean isCustomerLogon(String roleKey) {
? ? ? ? return checkRole(roleKey, r -> {
? ? ? ? ? ? return RoleTypeUtil.isCustomer(r);
? ? ? ? });
? ? }
所謂“函數參數”,雖然本質上也是用內部類實現。但是,那又怎樣呢?我們完全可以將其理解為函數參數來簡化我們的編程,不能將lambda簡單理解為少寫代碼的語法糖。
---------------------?
作者:carson0116?
來源:CSDN?
原文:https://blog.csdn.net/Carson0116/article/details/78652838?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的Java8 Lambda不仅仅只是语法糖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析java中的语法糖
- 下一篇: Java中的条件编译