自定义函数接口 

@FunctionalInterface   //可以检测接口是否是一个函数式接口,不满足条件时编译失败
public  interface  StartKafKaMongoTran<In1,In2,Out>   {
       Out start(In1 ags1,In2 ags2);

//       default  Out  wantDo(In1 a , In2 b)
//       {
//           //stat tran
              //manger1[0].stat
              //manger1[1].stat
////           MessageBuilder<In1, In2, Out>  result = this::builderMessage;
//           Out out = this.builderMessage(a, b);
//           //end stran
           //manger1[0].end
           //manger1[1].end
//           return  out;
//       }

}

test :

public class MyfunctionTest {
    //定义一个函数参数方法
    public static void doSomeThing(StartKafKaMongoTran<List<String>, List<Object>,String> mb,List<String> trans, List<Object> args){
           mb.start(trans,args);
    }

    public  static  void saveMongo(String msg){
        System.err.println(msg);
    }

    public  static  void sendKafka(String msg){
        System.err.println(msg);
    }

    public static void main(String[] args) {
        doSomeThing((transArr,agsArr)->{
            //transArr[0].startTrans()
            //transArr[1].startTrans()
            sendKafka("msg");
            saveMongo("msg");
            //transArr[0].submit()
            //transArr[1].submit()
            return null;
        },Arrays.asList("t,t1"),Arrays.asList("a1,a2"));
    }
}

 

例子1:

    public  static void   testflatmap(){
        Stream<String> s = Stream.of("test", "t1", "t2", "teeeee", "aaaa");
        s.flatMap(n -> Stream.of(n.split(""))).forEach(System.out::println);
    }

    /**
     * BiFunction<Integer,Integer,Integer>  两个输入参数Integer,Integer  ,一个输出参数
     * 有输入,输出 (x,y)->x+y
     */
    public  static Integer   testfuntion(BiFunction<Integer,Integer,Integer> f, int a, int b){

        return   f.apply(a,b);
    }

    /**
     *一个输入,一个输出参数
     */
    public  static Integer   testfuntion2(Function<Integer,Integer> f, int a){
        return   f.apply(a);
    }

    /**
     *一个输入,没有输出 Consumer  (x)->x*4
     * @param f
     * @param a
     * @return
     */
    public  static void   testfuntion3(Consumer<Integer> f, int a){
        f.accept(a);
    }

    /**
     * 2个输入,没有输出 BiConsumer (x,y)->print(x+y)
     * @return
     */
    public  static void   testfuntion3(BiConsumer<Integer,Integer> f, int a,int b){
           f.accept(a,b);
    }

    public static void main(String[] args) {
//        consumerTest();
//        testflatmap();
        Integer result = testfuntion((x, y) -> x + y, 1, 3);
        System.out.println(result);
    }

 

Java函数式接口:

1 Consumer
Consumer是一个函数式编程接口; 顾名思义,Consumer的意思就是消费,即针对某个东西我们来使用它,因此它包含有一个有输入而无输出的accept接口方法
除accept方法,它还包含有andThen这个方法;
其定义如下:

default Consumer<T> andThen(Consumer<? super T> after) {
    Objects.requireNonNull(after);
    return (T t) -> { accept(t); after.accept(t); };
}

可见这个方法就是指定在调用当前Consumer后是否还要调用其它的Consumer;
使用示例:

 

public static void consumerTest() {
    Consumer f = System.out::println;
    Consumer f2 = n -> System.out.println(n + "-F2");

    //执行完F后再执行F2的Accept方法
    f.andThen(f2).accept("test");

    //连续执行F的Accept方法
    f.andThen(f).andThen(f).andThen(f).accept("test1");
}

 


2 Function
Function也是一个函数式编程接口;它代表的含义是“函数”,而函数经常是有输入输出的,因此它含有一个apply方法,包含一个输入与一个输出
除apply方法外,它还有compose与andThen及indentity三个方法,其使用见下述示例;

 

/**
 * Function测试
 */
public static void functionTest() {
    Function<Integer, Integer> f = s -> s++;
    Function<Integer, Integer> g = s -> s * 2;

    /**
     * 下面表示在执行F时,先执行G,并且执行F时使用G的输出当作输入。
     * 相当于以下代码:
     * Integer a = g.apply(1);
     * System.out.println(f.apply(a));
     */
    System.out.println(f.compose(g).apply(1));

    /**
     * 表示执行F的Apply后使用其返回的值当作输入再执行G的Apply;
     * 相当于以下代码
     * Integer a = f.apply(1);
     * System.out.println(g.apply(a));
     */
    System.out.println(f.andThen(g).apply(1));

    /**
     * identity方法会返回一个不进行任何处理的Function,即输出与输入值相等; 
     */
    System.out.println(Function.identity().apply("a"));
}

 

3 Predicate
Predicate为函数式接口,predicate的中文意思是“断定”,即判断的意思,判断某个东西是否满足某种条件; 因此它包含test方法,根据输入值来做逻辑判断,其结果为True或者False。
它的使用方法示例如下:

/**
 * Predicate测试
 */
private static void predicateTest() {
    Predicate<String> p = o -> o.equals("test");
    Predicate<String> g = o -> o.startsWith("t");

    /**
     * negate: 用于对原来的Predicate做取反处理;
     * 如当调用p.test("test")为True时,调用p.negate().test("test")就会是False;
     */
    Assert.assertFalse(p.negate().test("test"));

    /**
     * and: 针对同一输入值,多个Predicate均返回True时返回True,否则返回False;
     */
    Assert.assertTrue(p.and(g).test("test"));

    /**
     * or: 针对同一输入值,多个Predicate只要有一个返回True则返回True,否则返回False
     */
    Assert.assertTrue(p.or(g).test("ta"));
}

 

posted on 2020-03-19 21:32  lshan  阅读(1340)  评论(0编辑  收藏  举报