一.简介 Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
二.基本写法 Lambda 表达式是接口或者是接口函数的简写。 (参数)-> 结果 如:(String s) -> s.length 如:x-> x*x 如:()-> {System.out.println(“Hello World.”);} 它就相当于其他语言里面的一个“匿名函数”或者“函数指针”,在java中实际上是“匿名类的一个实例”。
1.一个 Lambda 表达式可以有零个或多个参数 2.参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同 3.所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c) 4.空圆括号代表参数集为空。例如:() -> 42 5.当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a 6.Lambda 表达式的主体可包含零条或多条语句 7.如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致 8.如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
三.常用写法 Operation.java
1 2 3 4 5 6 7 8 package com.devnp;@FunctionalInterface public interface Operation { public void doIt (Integer a, String b) ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 package com.devnp;import java.util.Arrays;import java.util.Comparator;import java.util.List;import java.util.function.BiConsumer;import java.util.function.Consumer;public class LambdaDemo1 { public static void main (String[] args) { Consumer<Integer> c = (Integer x) -> { System.out.println(x) ;}; c.accept(5 ); BiConsumer<Integer, String> b = (Integer x, String y) -> System.out.println(x + " : " + y); b.accept(10 , "Hello World." ); execute(10 , "Hello" , new Operation () { @Override public void doIt (Integer a, String b) { System.out.println(a + ":" + b + "," + "Worker invoked using Anonymous class" ); } }); Operation operation = (Integer index, String str) -> {System.out.println(index + ":" + str);System.out.println("Worker invoked using Lambda expression" );}; execute(11 , "world" , operation); new Thread (() -> {System.out.println("Hello World." );}).start(); List<Integer> list = Arrays.asList(1 ,2 ,3 ,4 ,5 ,6 ,7 ); list.stream().map((x) -> x*x).forEach(System.out::println); String [] arraysStr = {"Z" , "A" ,"Y" } ; Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2)); Arrays.sort(arraysStr, sortByName); for (String string : arraysStr) { System.out.print(string); } } private static void execute (Integer a, String b, Operation operation) { operation.doIt(a, b); } }
四.使用条件 由于Lambda只能表示一个函数,所以,能写成Lambda的接口要求包含且最多只能有一个抽象函数,这样的接口可以使用@FunctionalInterface来表示,这样称之为函数式接口。
参考 https://www.coursera.org/learn/java-chengxu-sheji/lecture/eHjdD/5-6-lambdabiao-da-shi-lambdabiao-da-shi-jiao-gao-yao-qiu
Author:
Darren Du
License:
Copyright (c) 2019 MIT LICENSE