本節是lambda表達式的一個入門課,講解的同時配有練習demojava
前言什麼是lambda表達式?基礎語法函數式接口本身實現一個函數式接口jdk提供的函數式接口ConsumersupplierfunctionPredicate其餘場景python
lambda表達式是java8推出的一個新特性。標誌着從jdk1.8開始,java正式支持函數式編程。使用lambda表達式能夠用簡潔流暢的代碼完成一個功能,這也在必定程度上,能夠減輕了java一直爲人詬病的代碼簡潔性問題。web
lambda表達式能夠簡單理解爲一段能夠傳遞的代碼,核心思想是將面向對象中傳遞數據變爲傳遞行爲。下面舉一個編寫線程的例子。sql
1Runnable runnable = new Runnable() {
2 @Override
3 public void run() {
4 System.out.println("hello lambda");
5 }
6};
這裏使用的是匿名內部類的方式。匿名內部類實現的也是將代碼做爲數據傳遞,不過使用匿名內部類仍是不夠簡潔,那麼使用lambda表達式的代碼是什麼樣的呢?編程
1Runnable runnable = () -> System.out.println("hello lambda");
咱們能夠看到使用lambda表達式實現起來很是的簡單,只須要一行代碼便可,接下來咱們就試着分析一下這段代碼。數組
咱們能夠看到上述的示例代碼,lambda表達式的引用變量是一個runnable類型,事實上,java爲咱們提供了多種變量類型供咱們選擇,這些類型咱們稱之爲函數式接口。
函數式接口是隻有一個方法的接口,用做lambda表達式的類型。好比咱們以前提到的Runnable接口app
1@FunctionalInterface
2public interface Runnable {
3 /**
4 * When an object implementing interface <code>Runnable</code> is used
5 * to create a thread, starting the thread causes the object's
6 * <code>run</code> method to be called in that separately executing
7 * thread.
8 * <p>
9 * The general contract of the method <code>run</code> is that it may
10 * take any action whatsoever.
11 *
12 * @see java.lang.Thread#run()
13 */
14 public abstract void run();
15}
咱們能夠看到interface上一個註解@FunctionInterface,它的做用是告訴編譯器這個接口是一個函數式接口。dom
咱們能夠本身實現一個函數式接口,判斷數據的數據是否合法ide
1/**
2 * 自定義函式數接口
3 *
4 * @author jialin.li
5 * @date 2020-03-18 14:22
6 */
7@FunctionalInterface
8public interface CustomFunctionInterface<T> {
9 boolean legal(T t);
10}
測試方法:函數式編程
1/**
2 * 測試.
3 *
4 * @author jialin.li
5 * @date 2020-03-18 14:23
6 */
7public class Test {
8
9 public boolean legal(int value, CustomFunctionInterface<Integer> functionInterface){
10 return functionInterface.legal(value);
11 }
12
13 public static void main(String[] args) {
14 System.out.println(new Test().legal(-8, (x) -> x >= 0));
15 }
16}
測試結果:
1false
jdk在java.util.function中爲咱們提供了很是豐富的函數式接口,大體能夠分爲4類:
將輸入的10進制數,轉換爲2進制數輸出
1public void toBinaryString(int value, Consumer<Integer> consumer){
2 consumer.accept(value);
3}
4
5public static void main(String[] args) {
6 new Test().toBinaryString(15, (x) -> System.out.println(Integer.toBinaryString(x)));
7}
生成n個隨機數100之內的隨機數,以數組的形式返回
1public int[] getRandomArr(int n, Supplier<Integer> supplier) {
2 int[] arr = new int[n];
3 for (int i = 0; i < n; i++) {
4 arr[i] = supplier.get();
5 }
6 return arr;
7}
8
9public static void main(String[] args) {
10 int[] arr = new Test().getRandomArr(10, () -> new Random().nextInt(100));
11 System.out.println(Arrays.toString(arr));
12}
生成一個[1,n]組成的階乘數組,例如輸入3,返回[1,4,9]
1public int[] getFactorialArr(int n, Function<Integer,Integer> function) {
2 int[] arr = new int[n];
3 for (int i = 1; i <= n; i++) {
4 arr[i - 1] = function.apply(i);
5 }
6 return arr;
7}
8
9public static void main(String[] args) {
10 int[] arr = new Test().getFactorialArr(10, (x) -> x*x);
11 System.out.println(Arrays.toString(arr));
12}
判斷一個數是不是偶數
1public boolean isEven(int n, Predicate<Integer> predicate) {
2 return predicate.test(n);
3}
4
5public static void main(String[] args) {
6 boolean isEven = new Test().isEven(1102, (x) -> (x % 2 == 0));
7 System.out.println(isEven);
8}
除了上述的4個接口,java.util.function中還有許多其餘的接口,能夠實現各類功能。好比實現2個數的加法運算:
1public static void main(String[] args) {
2 BinaryOperator<Integer> binaryOperator = Integer::sum;
3 System.out.println(binaryOperator.apply(1, 3));
4}
實現List遍歷:
1public static void main(String[] args) {
2 List<String> list = new ArrayList<>(Arrays.asList("java", "python", "go", "sql"));
3 list.forEach(System.out::println);
4}
更多場景還請您去探索,感覺函數式編程的魅力吧
最後,期待您的訂閱和點贊,專欄每週都會更新,但願能夠和您一塊兒進步,同時也期待您的批評與指正!