摘要:概述簡介是一個匿名函數,我們可以把表達式理解為是一段可以傳遞的代碼將代碼像數據一樣進行傳遞。作為一種更緊湊的代碼風格,使的語言表達能力得到了提升。任何滿足單一抽象方法法則的接口,都會被自動視為函數接口。
1. 概述 1.1 簡介
Lambda 是一個匿名函數,我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風格,使 Java 的語言表達能力得到了提升。
1.2 為什么要使用 Lambda 表達式 1. 實例比如說我們要為 TreeSet 添加一個比價器,如果用原來的匿名內部類實現如下
@Test public void test1() { Comparatorcom = new Comparator () { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }; TreeSet ts = new TreeSet<>(com); TreeSet ts2 = new TreeSet<>(new Comparator () { @Override public int compare(Integer o1, Integer o2) { return Integer.compare(o1, o2); } }); ts2.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9)); System.out.println(ts2.toString()); }
Lambda 表達式實現如下
@Test public void test2() { Comparator2. 實例com = (x, y) -> Integer.compare(x, y); TreeSet ts = new TreeSet<>(com); ts.addAll(Arrays.asList(4, 5, 7, 3, 2, 1, 8, 6, 9)); System.out.println(ts.toString()); }
對一個 List 里面的對象進行操作
實體類
public class Employee implements Serializable { private int id; private String name; private int age; private double salary; // 省略 getter 和 setter 方法 }
基礎數據
Listemps = Arrays.asList( new Employee(1, "張三", 18, 9999.99), new Employee(2, "李四", 59, 6666.66), new Employee(3, "王五", 28, 3333.33), new Employee(4, "趙六", 8, 7777.77), new Employee(5, "田七", 38, 5555.55) );
我們有兩個需求,一個是“獲取公司中年齡小于 35 的員工信息”,一個是“獲取公司中工資大于 5000 的員工信息”
/** * 需求:獲取公司中年齡小于 35 的員工信息 * * @param emps * @return */ public ListfilterEmployeeAge(List emps) { List list = new ArrayList<>(); for (Employee emp : emps) { if (emp.getAge() <= 35) { list.add(emp); } } return list; } @Test public void test3() { List list = filterEmployeeAge(emps); for (Employee employee : list) { System.out.println(employee); } } /** * 需求:獲取公司中工資大于 5000 的員工信息 * * @param emps * @return */ public List filterEmployeeSalary(List emps) { List list = new ArrayList<>(); for (Employee emp : emps) { if (emp.getSalary() >= 5000) { list.add(emp); } } return list; }
這樣的話我要神隊每個需求都寫個方法,如果再增加需求,還需要再寫
定義一個接口
public interface MyPredicate{ public boolean test(T t); }
/** * 策略設計模式 * * @param emps * @param mp * @return */ public ListfilterEmployee(List emps, MyPredicate mp) { List list = new ArrayList<>(); for (Employee employee : emps) { if (mp.test(employee)) { list.add(employee); } } return list; } /** * 根據不同的需求實現不同的策略 */ @Test public void test4() { List list = filterEmployee(emps, new FilterEmployeeForAge()); for (Employee employee : list) { System.out.println(employee); } System.out.println("---------------------------------------"); List list2 = filterEmployee(emps, new FilterEmployeeForSalary()); for (Employee employee : list2) { System.out.println(employee); } }
/** * 匿名內部類 */ @Test public void test5() { Listlist = filterEmployee(emps, new MyPredicate () { @Override public boolean test(Employee t) { return t.getId() <= 103; } }); for (Employee employee : list) { System.out.println(employee); } }
/** * Lambda 表達式 */ @Test public void test6() { Listlist = filterEmployee(emps, (e) -> e.getAge() <= 35); list.forEach(System.out::println); System.out.println("------------------------------------------"); List list2 = filterEmployee(emps, (e) -> e.getSalary() >= 5000); list2.forEach(System.out::println); }
/** * Stream API */ @Test public void test7() { emps.stream() .filter((e) -> e.getAge() <= 35) .forEach(System.out::println); System.out.println("----------------------------------------------"); emps.stream() .map(Employee::getName) .limit(3) .sorted() .forEach(System.out::println); }2. Lambda 表達式的基礎語法
Java8 中引入了一個新的操作符 -> 該操作符稱為箭頭操作符或 Lambda 操作符,箭頭操作符將 Lambda 表達式拆分成兩部分:
左側:Lambda 表達式的參數列表(即接口抽象方法的參數列表)
右側:Lambda 表達式中所需執行的功能, 即 Lambda 體(即接口的實現)
Lambda 表達式需要“函數式接口”的支持
函數式接口:接口中只有一個抽象方法的接口,稱為函數式接口。可以使用注解 @FunctionalInterface 修飾,可以檢查是否是函數式接口
函數式接口可以有默認方法和靜態方法。
任何滿足單一抽象方法法則的接口,都會被自動視為函數接口。這包括 Runnable 和 Callable 等傳統接口,以及您自己構建的自定義接口。
2.1 無參數,無返回值() -> System.out.println("Hello Lambda!");1. 實例
@Test public void t1(){ Runnable r1 = () -> System.out.println("Hello Lambda!"); r1.run(); }2.2 有一個參數,并且無返回值
(x) -> System.out.println(x)1. 實例
@Test public void t2(){ Consumer2. 實例con = (x) -> System.out.println(x); con.accept("Hello Lambda!"); }
如果只有一個參數的情況下小括號是可以省略的
@Test public void t3(){ Consumer2.3 有兩個以上的參數,有返回值,并且 Lambda 體中有多條語句 1. 實例con = x -> System.out.println(x); con.accept("Hello Lambda!"); }
@Test public void t4() { Comparator2.4 若 Lambda 體中只有一條語句, return 和 大括號都可以省略不寫 1. 實例com = (x, y) -> { System.out.println("函數式接口"); return Integer.compare(x, y); }; }
@Test public void t5(){ Comparatorcom = (x, y) -> Integer.compare(x, y); }
Lambda 表達式的參數列表的數據類型可以省略不寫,因為JVM編譯器通過上下文推斷出,數據類型,即“類型推斷”,如果寫類型的話如下
@Test public void t6(){ Comparatorcom = (Integer x,Integer y) -> Integer.compare(x, y); }
本文首發于凌風博客:Java 8 新特性之Lambda表達式
作者:凌風
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72743.html
摘要:概述簡介若體中的功能,已經有方法提供了實現,可以使用方法引用可以將方法引用理解為表達式的另外一種表現形式方法引用的三種形式對象的引用實例方法名類名靜態方法名類名實例方法名注意方法引用所引用的方法的參數列表與返回值類型,需要與函數式接口中抽象 1. 概述 1.1 簡介 若 Lambda 體中的功能,已經有方法提供了實現,可以使用方法引用(可以將方法引用理解為 Lambda 表達式的另外一...
摘要:表達式說白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。就目前而言表達式只能簡化接口的匿名內部類實現。 Lambda表達式說白了就是一種匿名方法,不需要方法名,修飾符,和返回值類型。 使用方法 首先在moudle的build.gradle文件中添加配置:app/build.gradle添加。 android { ... defaultConfi...
摘要:歐陽思海繼承接口后,又加了新的抽象方法,這個接口就不再是函數式接口默認方法在接口中添加了一個默認方法。總結在這篇文章中,我們講了表達式方法引用函數式接口接口中的靜態方法接口中的默認方法的使用。 今天我來聊聊 Java8 的一些新的特性,確實 Java8 的新特性的出現,給開發者帶來了非常大的便利,可能剛剛開始的時候會有點不習慣的這種寫法,但是,當你真正的熟悉了之后,你一定會愛上這些新的...
摘要:在支持一類函數的語言中,表達式的類型將是函數。匿名函數的返回類型與該主體表達式一致如果表達式的主體包含一條以上語句,則表達式必須包含在花括號中形成代碼塊。注意,使用表達式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向對象語言,除了部分簡...
摘要:大家好,我是樂字節的小樂,上一次我們說到了核心特性之函數式接口,接下來我們繼續了解又一核心特性方法引用。方法引用是一種更簡潔易懂的表達式。感謝光臨閱讀小樂的,敬請關注樂字節后續將繼續講述等前沿知識技術。 大家好,我是樂字節的小樂,上一次我們說到了Java8核心特性之函數式接口,接下來我們繼續了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...
閱讀 1607·2021-11-23 09:51
閱讀 1178·2019-08-30 13:57
閱讀 2257·2019-08-29 13:12
閱讀 2011·2019-08-26 13:57
閱讀 1193·2019-08-26 11:32
閱讀 978·2019-08-23 15:08
閱讀 699·2019-08-23 14:42
閱讀 3079·2019-08-23 11:41