• 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:
  • 相关阅读:
    【Java学习】向上和向下转型
    【Java学习】java抽象类的作用
    【Java学习】追踪
    【Java学习】@Override 解释
    【Java学习】Java 中带包(创建及引用)的类的编译与调试
    【Java学习】相关基础算法
    【Java学习】import和import static的区别
    【testNG学习】testng.xml文件
    Reshape the Matrix
    Distribute Candies
  • 原文地址:https://www.cnblogs.com/jinmoon/p/8615544.html
Copyright © 2020-2023  润新知