标签:vat 问题 accept 接收 app panel click mes macro
突然间又来了一个新需求,比如,我想要所有人的名字,不要其他信息。
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方法的定义,所以可以传过去。
下面简单演示一下最后两个函数式接口的用法:
@Testpublic void test() { printListWithLine(allPersonList, System.out::println);}private <T> void printListWithLine(List<T> list, Consumer<T> consumer) { for (T t : list) { consumer.accept(t); }} |
@Testpublic void test() { Supplier<Person> personSupplier = Person::new; Person person = personSupplier.get();} |
标签:vat 问题 accept 接收 app panel click mes macro
原文地址:https://www.cnblogs.com/zhandouBlog/p/9383239.html