一、先睹为快
先上段经典代码来让客官瞧一瞧
// 创建一个list集合, 现需求是:对其进行排序并打印到控制台 List<String> shield = Arrays.asList("sky","coulson","wode","may");
// 原始方法 shield.sort(new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); for (String name : shield) { System.out.println(name); }
// JDK 1.8 shield.sort((s1, s2) -> s1.compareTo(s2)); shield.forEach(s -> System.out.println(s));
// 再或者 shield.sort(String::compareTo); shield.forEach(s -> System.out.println(s));
相比于原先排序功能需要好多行的代码,现如今简洁了不少,当然了,这些代码的执行结果当然是一样的。
二、说明和分析
读音:同 λ(兰姆达),理科生出生必然很熟悉这个符号
写法:由三部分构成,
逗号分隔的参数列表 -> 函数体
概念:Lambda允许把函数作为一个方法的参数,或者把代码看成数据
对于shield.sort((s1, s2) -> s1.compareTo(s2));
这段代码,其实写齐全一点,可以是shield.sort((String s1, String s2) -> {return s1.compareTo(s2); });
但是由于Java编译器能够自动识别参数的类型,所此处省略参数类型 String,另外,当函数体内部是由一行代码块构成的时候,花括号“{ }”也是可以省略的。
对于shield.sort(String::compareTo);
这段代码,其实是Java 8 所允许的可以通过 :: 关键字来获取方法或构造函数的引用,本例中便是获取方法,下面的例子便是获取构造函数的引用。
// Step1、定义一个简单的JavaBean, 但是包含了两种不同的构造方法 class Person{ String name; Integer age; Person() {} Person(String name, Integer age) { this.name = name; this.age = age; } }
// Step2、定义一个person工厂的接口来创建person interface PersonFactory<p extends Person> { p create(String name, Integer age); }
// Step3、当想通过工厂来创建person的时候,现在,并不需要手动实现这个接口 // 而只需要使用 Person::new 来创建 Person 类的构造函数的引用, Java 编译器会自动地选择合适的构造函数来匹配 PersonFactory<Person> personFactory = Person::new; Person person = personFactory.create("sky", 24);
文章评论
卡哇伊呢,粉一下,再做个小广告