Lamda表达式

Lamda表达式

JDK在不断升级的过程中,要致力解决的问题之一就是让程序代码变得更加简洁。JDK8引入的Lamda表达式在简化程序代码方面大显身手,它用简明扼要的方法来表达某种功能所包含的操作。在各种遍历访问集合元素的场合,运用lamda表达式可以大大简化操纵集合的程序代码。

Lamda表达式基本用法

下面的代码通过3种方式遍历访问List列表,其中第二和第三种方式使用Lamda表达式。

public class LamdaTest {
    public static void main(String[] args) {
        String[] ards = {"Tom", "Mike", "Jone", "Linda"};
        List<String> names = Arrays.asList(ards);
        //方式一:传统的遍历集合的方式
        for (String name : names) {
            System.out.println(name);
        }
        //方式二:使用Lamda表达式
        names.forEach(name -> System.out.println(name));
        //方式三:使用Lamda表达式
        names.forEach(System.out::println);
    }
}

Lamda表达式的基本语法为:

(Type1 param1,Type2 param2,...,TypeN paramN)->{
statement1;
statement2;
//...
return statementM;
}

从Lamda表达式的基本语法可以看出,Lamda表达式可以理解为一段带有输入参数的执行语块,这种表达式方式也称为函数表达式。
方式二的Lambda表达式的完整与法应该是

 names.forEach(name -> {
            System.out.println(name);
            return;
        });

Lambda表达式还有各种简化版:
(1)参数类型可以省略。
(2)当Lambda表达式的参数只有一个时,可以省略小括号。
(3)当Lambda表达式只包含一条语句时,可以省略大括号、语句末尾的分号。此外,当return没有返回值时也可以省略

方式三还通过“::”来直接调用println()方法

names.forEach(System.out::println);

用Lambda表达式代替内部类

Lambda表达式的一个重要用武之地是代替内部类。例如,在下面的代码中,用3种方式创建线程。其中方式二和方式三使用了Lambda表达式。

public class InnerTester {
  public static void main(String[] args) {
      //方式一:使用匿名内部类
      new Thread(new Runnable() {
          @Override
          public void run() {
              System.out.println("Hello World!");
          }
      }).start();
      //方式二:使用Lambda表达式
      new Thread(()->System.out.println("Hello World!")).start();
      //方式三:使用Lambda表达式
      Runnable race = () -> System.out.println("Hello World!");
      new Thread(race).start();
  }
}

用Lambda表达式对集合进行排序

一下代码提供了3种对集合进行排序的大方式。其中方式二和方式三都采用了Lambda表达式。

public class Tester01 {
    public static void main(String[] args) {
        String[] data={"Tom","Mike","Mary","Linda","Jack"};
        List<String> names = Arrays.asList(data);

        //方式一:通过创建匿名的Comparator实例来排序
        Comparator<String> cp = new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s1.compareTo(s2));
            }
        };
        Collections.sort(names,cp);

        //方式二:用Lambda表达式来排序
        Comparator<String> sortByName= (String s1, String s2) -> (s1.compareTo(s2));
        Collections.sort(names,sortByName);
        //方式三:用Lambda表达式来排序
//        Collections.sort(names,(String s1,String s2)->s1.compareTo(s2));
        Collections.sort(names, Comparator.naturalOrder());
        names.forEach(System.out::println);
    }
}

输出结果

Jack
Linda
Mary
Mike
Tom

Lambda表达式中的方法引用

编译器能根据上下文来推断Lambda表达式的参数的场合,可以在Lambda表达式中省略参数,直接通过“::”符号来引用方法。方法引用的语法格式有一下3中

x->System.out.println(x)  等同于:System.out::println //引用实例方法
(x,y)->Math.max(x,y)      等同于:Math::max          //引用静态方法
x->x.toLowerCase()        等同于:String::toLowerCase //引用实例方法

在Lambda表达式中,对构造方法的引用的语法如下:
ClassName::new
例如

x->new BigDecimal(x) 等同于 BigDecimal::new

函数式接口

Runnable race=()->System.out.print("HelloWord");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值