JAVA8 Function及Stream编程

  • Post author:
  • Post category:java


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);

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



版权声明:本文为blacksoil55原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。