写在前面
JDK8 API提供了很多函数式接口,这些函数式接口可以被抽象成一个具体的方法,并且使其使用在Lambda表达式中,今天我们要来说的就是其中的Consumer函数接口。
JDK8函数式接口之Consumer
从名字来看,我们就能知道Consumer是一个消费型函数式接口,此函数具有一个抽象方法,让我们来一起看一下吧。
此函数可以将传入的参数进行任意的操作或者逻辑判断筛选。
accept方法
accept方法,针对所给到的参数,进行一系列自定义的操作。
让我们先来看看示例吧:
@Data @AllArgsConstructor @NoArgsConstructor public class Test { private String name; private String pwd; public static void main(String[] args) { List<Test> listList = new ArrayList<>(); Consumer<Test> consumer = x -> { if ("张三".equals(x.getName())){ listList.add(x); } }; List<Test> list = new ArrayList<>(); list.add(new Test("张三","123")); list.add(new Test("张四","123")); list.add(new Test("张五","123")); list.add(new Test("张六","123")); list.stream().forEach(consumer); System.out.println(JSON.toJSONString(listList)); } }
再来看一下执行结果,如下:
最后是将张三的这条记录添加到了集合中了。
现在consumer的使用也就明朗了,在Consumer函数中是可以定义一个逻辑来,根据传入的参数的不同获得不同的结果。
这里并没有说道accept方法,其实这里的forEach方法中默认已经调用了,如果是不用forEach方法的话,那就是下面的这种方式了。
public static void main(String[] args) { List<Test> listList = new ArrayList<>(); Consumer<Test> consumer = x -> { if ("张三".equals(x.getName())){ listList.add(x); } }; List<Test> list = new ArrayList<>(); list.add(new Test("张三","123")); list.add(new Test("张四","123")); list.add(new Test("张五","123")); list.add(new Test("张六","123")); for (Test test : list){ consumer.accept(test); } System.out.println(JSON.toJSONString(listList)); }
执行结果是一样的。
默认方法andThen
此方法是Consumer函数接口的默认方法,其提供的功能就是在原来的基础上增加是附加条件。
代码示例如下:
for (Test test : list){ consumer.andThen(consumer2).accept(test); }
如上使用方法中的consumer2是新定义的一个Consumer对象,在这里面可以加入更多的逻辑元素。
总结
今天学习完Consumer函数式接口,是否有更多收获呢?