zoukankan      html  css  js  c++  java
  • 6.3 lambda 表达式

    6.3.1 lambda 表达式是一个可传递的代码块,可以在以后执行一次或者多次。

           思考(如何按指定时间间隔完成工作,将这个工作放在一个ActionListener的actionPerformed方法中:)

    class Worker implements ActionListener
    {
        public void actionPerformed(ActionEvent event )
        {
          //do some work  
        }
    }

       想要反复执行这个代码,可以构造Worker类的一个实例,然后把这个实例提交到一个Timer对象。这里的重点是actionPerformed方法包含希望以后执行的代码。

        思考(如何用一个定制比较器完成排序。想要按长度而不是默认的字典顺序对字符串排序对字符串排序,可以向sort方法传入一个Comparator对象:)

    class lengthComparator implements Comparator<String>
    {
        public int compare(String first,String second)
        {
            return first.length()-second.length();
        }
    }
    ...
    Arrays.sort(strings,new lengthComparator());

    共同点:都是将一个代码块传递到某个对象(一个是定时器,或者一个sort方法)。这个代码快会在将来某个时间调用。

    6.3.2 lambda表达式的语法

    (String first,String second)
          ->first.length()-second.length()

              这是我看到的第一个lambda表达式,lambda表达式就是一个代码块,必须传入代码的变量规范。

            --------带参数变量的表达式就被称为Lambda表达式。

    -------------------------表达式形式,参数,箭头(->)以及一个表达式。如果代码要完成的计算无法放在一个表达式中,就把这些代码放在{}中,并包含显示的return语句。如:

    (String first,String second)->{
         if(first.length()<second.length()) return -1;
    else if (first.length()>second.length())  return 1;
    else return 0;
    }

    即使lambda表达式没有参数,任然需要空括号,就像无参数方法一样:

    ( ->) {for(int i=100;i>=0;i--) System.out.println(i); }

    如果可以推导出lambda表达式的参数类型,则可以忽略其类型。如:

    Comparator<String> comp
            =(first,second)
                ->first.length()>second.length();

    如果方法只有一个参数,而且这个参数的类型可以推导得出,那么还可以省略小括号;

    ActionListener listener =event->
           System.out.println("The time is "+new Data()); 

    无需指定lambda表达式的返回类型。lambda表达式的返回类型总是会由上下文推导得出。如:

    (String first,String second)->first.length()-second.length()

    上面的可以在需要int类型结果的上下文中使用。

    下例程序显示了如何在一个比较器和一个动作监听器中使用lambda表达式。

     1 package cc.openhome;
     2 import java.awt.Toolkit;
     3 import java.util.Arrays;
     4 import java.util.Date;
     5 import javax.swing.JOptionPane;
     6 import javax.swing.Timer;
     7 public class LambdaTest {
     8     public static void main(String[] args) {
     9         // TODO code application logic here
    10         String[] planets =new String[] {"Yi","Er","San","Si","Wu","Liu","Qi","Ba"};
    11         System.out.println(Arrays.toString(planets));
    12         System.out.println("Sortd in dictionary order:");
    13         Arrays.sort(planets);
    14         System.out.println(Arrays.toString(planets));
    15         System.out.println("Sorted by length:");
    16         Arrays.sort(planets,(first,second) -> first.length()-second.length());
    17         System.out.println(Arrays.toString(planets));
    18         Timer t =new Timer (1000,event -> {System.out.println("The time is "+new Date());Toolkit.getDefaultToolkit().beep();});
    19         t.start();
    20          JOptionPane.showMessageDialog(null, "Quit programe?");
    21     }  
    22 }
    [Yi, Er, San, Si, Wu, Liu, Qi, Ba]
    Sortd in dictionary order:
    [Ba, Er, Liu, Qi, San, Si, Wu, Yi]
    Sorted by length:
    [Ba, Er, Qi, Si, Wu, Yi, Liu, San]
    The time is Wed Mar 21 10:00:34 CST 2018
    The time is Wed Mar 21 10:00:35 CST 2018
    The time is Wed Mar 21 10:00:36 CST 2018
    The time is Wed Mar 21 10:00:37 CST 2018
    The time is Wed Mar 21 10:00:38 CST 2018
    The time is Wed Mar 21 10:00:39 CST 2018
    The time is Wed Mar 21 10:00:40 CST 2018
    The time is Wed Mar 21 10:00:41 CST 2018
    成功构建 (总时间: 8 秒)
    run:
  • 相关阅读:
    [BJOI2019] 光线
    C# 从零开始写 SharpDx 应用 笔刷
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    BAT 脚本判断当前系统是 x86 还是 x64 系统
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    win2d 通过 CanvasActiveLayer 画出透明度和裁剪
    PowerShell 拿到显卡信息
    PowerShell 拿到显卡信息
    win10 uwp 如何使用DataTemplate
    win10 uwp 如何使用DataTemplate
  • 原文地址:https://www.cnblogs.com/jinmoon/p/8615544.html
Copyright © 2011-2022 走看看