JAVA8 Function及Stream编程

来源:互联网 发布:c语言 long类型 编辑:程序博客网 时间:2024/04/29 03:53


JAVA8引入函数式编程后,增加了灵活性,原来需要通过ScriptEngine调用脚本语言,现在通过Function接口即可。
方便了编码,代码也比较简洁些。
1. Function
    函数式编程的格式如下集中方式:
    a. 标准方式
    (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }

    b.省略类型
    (param1,param2, ..., paramN) -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }
    
    c.参数为1个时,可用省略参数小括号
    param1 -> {
    statment1;
    statment2;
    //.............
    return statmentM;
    }
    
    d. 语句只有一条时,可省略语句大括号
    param1 -> statment
    
    Function典型的应用场景为:A. 1个只有1个方法的接口,避免写匿名类; B. 接受Fuction接口为参数的方法
    例子1:正常情况下Thread构造函数中接受实现了Runnable接口的匿名类:
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println("hello new thread");
            }        

        });


    用Function方式实现:
    new Thread(()->System.out.println("hello new thread")).run();    
    这里Runnable已经加了@FunctionalInterface标注,是不是简洁了很多,这种写法就是对于初学者看起来可能比较莫名。是不是简洁了很多,这种写法就是对于初学者看起来可能比较莫名。

    例子2:自己实现一个@FunctionalInterface接口
    @FunctionalInterface
    public interface BaseAdapterInf {
        public abstract void work(String name);
    }
    TestFunction类实现1个调用接口的方法
    public void invokeRule3(BaseAdapterInf adapter, String name){
        adapter.work(name);
    }
    具体调用:
    TestFunction testf=new TestFunction();
    testf.invokeRule3((name)->System.out.println(name+ " welcome!"),"lisi");

    
    
    例子3: 实现1个调用Function方法的类
    import java.util.function.Function;
    TestFunction类实现方法:
    public void invokeRule2(String input, Function<String, Integer> function){
        int len= function.apply(input);  //需要有返回值
        System.out.println(len);
        //return result;
        }
    }

    具体调用:
    TestFunction testf=new TestFunction();
        testf.invokeRule2("hello world", (input)->{
            return input.length();
        });
    }
    
2. 方法引用
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
类型     示例
引用静态方法     ContainingClass::staticMethodName
引用某个对象的实例方法     containingObject::instanceMethodName
引用某个类型的任意对象的实例方法     ContainingType::methodName
引用构造方法     ClassName::new
    
静态方法引用例子:

  String::valueOf   等价于lambda表达式 (s) -> String.valueOf(s)

  Math::pow       等价于lambda表达式  (x, y) -> Math.pow(x, y);    
    

   

###本文中为原创,引用者请注明出处

原创粉丝点击