函数式接口的使用
import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; public class FunctionTest { /** * Predicate * java.util.function.Predicate<T>接口定义了一个名叫test的抽象方法,它接受泛型 T对象,并返回一个boolean。 * 如果你去查Predicate接口的Javadoc说明,可能会注意到诸如and和or等其他方法。现在 你不用太计较这些,我们会在3.8节讨论 * @param list * @param predicate * @param <T> * @return */ public static <T> List<T> filter(List<T> list, Predicate<T> predicate){ List<T> results = new ArrayList<>(); for (T t : list) { if (predicate.test(t)){ results.add(t); } } return results; } /** * Consumer * java.util.function.Consumer<T>定义了一个名叫accept的抽象方法,它接受泛型T 的对象,没有返回(void)。 * 你如果需要访问类型T的对象,并对其执行某些操作,就可以使用 这个接口。 * List的forEach的的底层其实用到了 Consumer 这个函数式接口 * @param list * @param consumer * @param <T> */ public static <T> void forEachPrint(List<T> list, Consumer<T> consumer){ for (T t : list) { consumer.accept(t); } } /** * java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个 泛型T的对象,并返回一个泛型R的对象。 * 如果你需要定义一个Lambda,将输入对象的信息映射 到输出,就可以使用这个接口。 * @param list * @param function * @param <T> * @param <R> * @return */ public static <T,R> List<R> map(List<T> list, Function<T,R> function){ List<R> results = new ArrayList<>(); for (T t : list) { R apply = function.apply(t); results.add(apply); } return results; } public static void main(String[] args) { /** * Predicate的使用 */ List<String> list = new ArrayList<>(); List<String> filter = FunctionTest.filter(list, (s -> !s.trim().isEmpty())); /** * Consumer的使用,打印还可以直接使用第二种方式 */ FunctionTest.forEachPrint(list,s -> { System.out.println(s); }); FunctionTest.forEachPrint(list,System.out::println); /** * Function的使用 * 输入字符串,得到字符串的长度 */ List<Integer> map = FunctionTest.map(list, s -> s.length()); } }
来源:《java8实战》