提示:
JAVA8由->表示分割,左半部分表示参数,右半部分表示实现体
不要和JS的lambda表达式混淆 =>
先来一串简单的案例:
import java.util.Arrays;
/**
* @Author: WuChao
* @ClassName:PACKAGE_NAME
* @Description:函数式编程, 所有的对象都会拒绝被修改
* @date 2018/3/22
*/
public class Java8Method {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
Arrays.stream(arr).map((x) -> x = x + 1).forEach(System.out::println);
Arrays.stream(arr).forEach(System.out::println);
}
}
函数式编程, 所有的对象都会拒绝被修改
也因为如此,函数式编程更加易于并行,我们完全不用担心线程安全的问题;不必要进行任何的同步操作;
再来一个例子
import java.util.Arrays;
import java.util.function.Function;
/**
* @Author: WuChao
* @ClassName:PACKAGE_NAME
* @Description:函数式编程,类似于JS
* @date 2018/3/22
*/
public class Java8Method {
public static void main(String[] args) {
Integer num = 8;
Function<Integer, String> conv = (from) -> from *num+"超哥你不愧是最帅的!!!嘿嘿嘿!!!";
System.out.println(conv.apply(8));
}
}
上面代码存在着一个问题:num没有用final修饰,虽然编译照样通过,那是因为java8自动将lambda表达式中的变量视为final
import java.util.ArrayList;
/**
* @Author: WuChao
* @ClassName:PACKAGE_NAME
* @Description:方法引用
* @date 2018/3/22
*/
public class InstanceMethodRef {
public static void main(String[] args) {
ArrayList<User> users = new ArrayList<User>();
for (int i = 0; i < 2; i++) {
users.add(new User(i + "嘿嘿"));
}
users.stream().map(User::getName).forEach(System.out::println);
users.stream().map((User)->User=new User("哈哈哈")).map(User::getName).forEach(System.out::println);
users.stream().map(User::getName).forEach(System.out::println);
}
}
控制台结果如下:
0嘿嘿
1嘿嘿
哈哈哈
哈哈哈
0嘿嘿
1嘿嘿