Java SE8 Lambda 基础入门---两个函数式接口:Predicate、Consumer

来源:互联网 发布:计算机的发展史知乎 编辑:程序博客网 时间:2024/06/06 07:29

Interface Predicate < T >

@FunctionalInterface
public interface Predicate
Represents a predicate (boolean-valued function) of one argument.
This is a functional interface whose functional method is test(Object).

java doc 说得很清楚,Predicate这个函数式接口,接受一个变量,返回boolean值,而要实现的这个函数式方法就是test(Object)方法,怎么用看示例:

package com.tangym.learnlambda.FunctionalInterfaces;import java.util.function.Predicate;public class PredicateExample {    public static void main(String[] args) {        // test方法        Predicate<String> i = (s) -> s.length() > 5;        System.out.println(i.test("123456"));        //使用lambda表达式        performConditionally(p -> p > 2);    }    private static void performConditionally(Predicate<Integer> predicate) {        int[] a = { 0, 1, 3 };        for (int p : a) {            if (predicate.test(p)) {                System.out.println(p);//out:3 p > 2的只有3            }        }    }}

初次用这个接口可能会有点抽象,耐心点看下例子,自己动手运行下。

Interface Consumer < T >

@FunctionalInterface
public interface Consumer
Represents an operation that accepts a single input argument and returns no result. Unlike most other functional interfaces, Consumer is expected to operate via side-effects.
This is a functional interface whose functional method is accept(Object).

上面说了,这个函数式接口啊,接受一个参数,但是没有返回值,通过副作用去发挥效果(下面解释),函数式方法是accept(Object),我们写lambda表达式,要把这个方法给实现了。

“Consumer is expected to operate via side-effects.” 这句话怎么理解,先介绍下什么叫 纯函数。
纯函数就是显示的 有输入,有输出的函数。好了,我们这个函数接口没有输出,那么它肯定就要改变一些什么,改变的这个就叫做 side-effects 副作用(副作用不全是坏的)。
Consumer的副作用则是改变了数据状态(理解错误,请速度指正我)。
使用看例子:

package com.tangym.learnlambda.FunctionalInterfaces;import java.util.function.Consumer;import java.util.function.Predicate;public class ConsumerExample {    public static void main(String[] args) {        //简单使用,直接用Consumer写一个lambda表达式        Consumer<String> c = (x) -> System.out.println(x.toLowerCase());//out:test1 test2        c.accept("TesT1");        c.accept("TesT2");        //调用自己构造的静态方法        performConditionally(p->p>2,p->System.out.println(p));//    }    private static void performConditionally(Predicate<Integer> predicate,Consumer<Integer> consumer) {        int[] a = { 0, 1, 3,4 };        for (int p : a) {            if (predicate.test(p)) {                //将满足条件p>2的,全部给consumer.accept(),consumer类型的lambda表达式则会把accept的参数全部执行                consumer.accept(p);            }        }    }}

对应的还有一个BiConsumer的函数式接口,是接受两个入参,用法相同。

阅读全文
0 0
原创粉丝点击