突然间又来了一个新需求,比如,我想要所有人的名字,不要其他信息。
package com.qunar.hotel.java8; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.junit.Test; import java.util.List; public class MyTest { private final List<Person> allPersonList; { Person p1 = new Person( "风清扬" , 42 ); Person p2 = new Person( "独孤求败" , 66 ); Person p3 = new Person( "令狐冲" , 16 ); Person p4 = new Person( "东方不败" , 25 ); allPersonList = ImmutableList.of(p1, p2, p3, p4); } @Test public void test() { System.out.println(getAllName()); } private List<String> getAllName() { List<String> names = Lists.newArrayList(); for (Person person : allPersonList) { names.add(person.getName()); } return names; } } |
这就有一个问题是,需要所有人的住址怎么办,所有人的手机号怎么办,在写几个方法?还是写switch然后case?这样办。
public void test() { List<String> nameList = transform(allPersonList, Person::getName); List<Integer> ageList = transform(allPersonList, Person::getAge); System.out.println(nameList); System.out.println(ageList); } private <T,R> List<R> transform(List<T> list, Function<T,R> function){ List<R> result = Lists.newArrayList(); for (T t : list){ R apply = function.apply(t); result.add(apply); } return result; } |
Function的apply方法接收一个参数返回一个参数,Person:::getName这个表达式编译器可以识别出入参是Person的一个实例,返回值是一个String,符合apply方法的定义,所以可以传过去。
下面简单演示一下最后两个函数式接口的用法:
@Test public void test() { printListWithLine(allPersonList, System.out::println); } private <T> void printListWithLine(List<T> list, Consumer<T> consumer) { for (T t : list) { consumer.accept(t); } } |
@Test public void test() { Supplier<Person> personSupplier = Person:: new ; Person person = personSupplier.get(); } |