苹果|Java8中的Lambda总结

苹果|Java8中的Lambda总结


Lambda表达式
lambda 表达式是在Java8 中引入的 。 lambda表达式是一个可以传递的代码块 , 可以在以后执行一次或者多次 。
简洁语法 , 函数式编程(Java中以对象为基础 , 如果想要传递一个代码块x , 需要在传递的对象中的包含某种方法中囊括这些代码块 , 解决此问题)避免匿名内部类定义过多 , 简化代码 。
lambda表达式形式表达式形式: (参数) , 箭头(->)表达式
exp:
Comparator<String> comparator = (String s1 String s2 )->{
           if (s1.length() > s2.length()) {
               return 1;
            else if (s1.length() == s2.length()) {
               return 0;
            else {
               return -1;
           
       ;

  • 如果lambda没有参数 其中的 ()不能省略
Runnable abc = () -> {
           System.out.println(\"abc\");
       ;
  • 如果lambda表达式的参数类型可以由编译器推导出 , 可以忽略参数类型定义 。
Comparator<String> comparator = (s1 s2)->{
           if (s1.length() > s2.length()) {
               return 1;
            else if (s1.length() == s2.length()) {
               return 0;
            else {
               return -1;
           
       ;
  • 如果方法只有一个参数 , 而且这个参数的类型可以推导 , 还可以省略小括号 。
ActionListener listener = event ->{
           System.out.println(\"Hello\");
       ;
  • 如果方法只有一条语句 , {也可以省略
ActionListener listener = event -> System.out.println(\"Hello\");
无需指定lambda表达式的返回类型 , lambda表达式的返回类型由上下文推导得出 。
如果lambda表达式只在某些条件分支有返回值 , 是不合法的 , 也即由上下文推导出的返回值类型必须一致 。
  • 错误例子如下:
Comparator<String> comparator = (s1 s2 )->{
           if (s1.length() > s2.length()) {
               return 1;
            else if (s1.length() == s2.length()) {
               return 0;
           
       ;
  • 使用lambda表达式:
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class LambdaTest {

   public static void main(String[
args) {
       String [
plants = new String[
{
           \"Andy\"\"Jacob\" \"xiaoHong\" \"Bob\" \"Cindy\" \"Lucy\" \"David\"
       ;
       // 打印原字符串数组
       System.out.println(Arrays.toString(plants));