功能接口:只包含一个方法的接口被称为功能接口,Lambda 表达式用用于任何功能接口适用的地方。函数集合:Java 8 的类库包含一个新的包java.util.functions ,这个包中有很多新的功能接口,这些接口可与集合API 一起使用。
java.util.functions.Predicate;
使用谓词(Predicate) 来筛选集合:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
List<String> filteredNames = names.filter(e -> e.length() >= 4) .into(new ArrayList<String>());
for (String name : filteredNames) {
System.out.println(name); }
这里我们有两个新方法:
Iterable<T> filter(Predicate<? super T>) 用于获取元素满足某个谓词返回true 的结果
<A extends Fillable<? super T》 A into(A) 将用返回的结果填充ArrayList
java.util.functions.Block我们可使用一个新的迭代器方法来替换for 循环void forEach(Block<? super T>):
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
names .filter(e -> e.length() >= 4)
.forEach(e -> { System.out.println(e); });
forEach() 方法是internal iteration 的一个实例:迭代过程在Iterable 和Block 内部进行,每次可访问一个元素。
最后的结果就是用更少的代码来处理集合:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
names.mapped(e -> { return e.length();
}) .asIterable() // returns an Iterable of BiValue elements
// an elements key is the persons name, its value is the string length.filter(e -> e.getValue() >= 4)。sorted((a, b) -> a.getValue() - b.getValue()) .forEach(e -> { System.out.println(e.getKey() + + e.getValue()); }); 这样做的优点是:元素在需要的时候才进行计算如果我们取一个上千个元素的集合的前三条时,其他元素就不会被映射鼓励使用方法链我们无需才存储中间结果来构建新的集合内部迭代过程因此大多数细节。
例如,我们可以通过下面代码来并行map() 操作
writing myCollection.parallel()。map(e ?> e.length())。
方法引用:我们可通过:: 语法来引用某个方法。方法引用被认为是跟Lambda 表达式一样的,可用于功能接口所适用的地方。
我们可以引用一个静态方法:
executorService.submit(MethodReference::sayHello);
private static void sayHello() {System.out.println("hello"); } 或者是一个实例的方法:
Arrays.asList("Alice", "Bob", "Charlie", "Dave")。forEach(System.out::println); 我们也可以创建工程方法并将构造器引用赋值给java.util.functions.Factory:
Factory<Biscuit> biscuitFactory = Biscuit::new;
Biscuit biscuit = biscuitFactory.make(); 最后,我们创建一个引用到随意实例的例子:
interface Accessor<BEAN, PROPERTY> {
PROPERTY access(BEAN bean); }
public static void main(String[] args) {
Address address = new Address("29 Acacia Road", "Tunbridge Wells");
Accessor<Address, String> accessor = Address::getCity;
System.out.println(accessor.access(address)); }
这里我们无需绑定方法引用到某个实例,我们直接将实例做为功能接口的参数进行传递。