引子:闲览ss.gg,有个主在15年10月份开了个贴“JAVA8新特性”,结果就写了个default,电脑就没电了。。。
网友评论(2233):
Java8 新特性
环境:
MacBook Pro 15
jdk8
IntelliJ IDEA
1.Lambda表达式(来自数学符号λ,读音lambda)
总结
1. 定义:Lambda 表达式,也称闭包,允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
2. 语法(组成):“参数列表”+“->”+“函数”
3. 优点:使用 Lambda 表达式可以使代码变的更加简洁紧凑。
4. 特征(语法):1.参数列表参数类型可有可无(不需要声明参数类型,编译器可以根据上下文推测)
2.参数列表圆括号可有可无(一个参数无需定义圆括号,但多个参数需要定义)
3.函数体大括号可有可无(如果主体包含了一个语句,就不需要使用大括号)
4.函数体返回关键字return可有可无(如果主体只有一个表达式返回值则编译器会自动返回,否则需要在大括号里指定返回一个表达式返回值)
传参注意项:Lambda表达式可以(作为参数)访问外层的“特殊”局部变量
“特殊”的含义:
1. lambda 表达式只能引用标记了[final static | static]的外层局部变量,这就是说不能在 lambda 内部修改定义在外层的局部变量,否则会编译错误;
2. lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义:不可修改);
3. 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力
可了解下Scala,Scala 是一门多范式(multi-paradigm)的编程语言,集成了面向对象编程和函数式编程的各种特性。Java也在不断丰富自身。
以下实例参考菜鸟教程
lz机子上跑过了,放心食用。
Lambda表达式:语法实例1-对应(语法)特征1-4食用
package com.diduo.jb.lambda;
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
// 不用类型声明(特征1)
MathOperation subtraction = (a, b) -> a - b;
// 类型声明(特征1)
MathOperation addition = (int a, int b) -> a + b;
// 没有大括号及返回语句(特征3)
MathOperation division = (int a, int b) -> a / b;
// 大括号中的返回语句(特征4,指明返回表达式返回了一个数值)
MathOperation multiplication = (int a, int b) -> { return a * b; };
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
// 不用括号(特征2,3)
GreetingService greetService1 = message -> System.out.println("Hello " + message);
// 用括号(特征2,3)
GreetingService greetService2 = (message) -> System.out.println("Hello " + message);
greetService1.sayMessage("Runoob");
greetService2.sayMessage("Google");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
输出结果
10 - 5 = 5
10 + 5 = 15
10 / 5 = 2
10 x 5 = 50
Hello Runoob
Hello Google
Lambda表达式:变量作用域实例1-对应传参注意项1食用
public class Java8Tester {
// 只能引用标记了 [final static | static] 的外层局部变量,不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误
final static String salutation = "Hello! "; // ok
// static String salutation = "Hello! "; // ok
// final String salutation = "Hello! "; // 编译错误
public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message);
greetService1.sayMessage("Runoob");
}
interface GreetingService {
void sayMessage(String message);
}
}
输出结果
Hello! Runoob
Lambda表达式:变量作用域实例2-对应传参注意项2食用
/**
* 1. 直接在 lambda 表达式中访问外层的局部变量
* 2. 局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
* @param args
*/
public static void main(String args[]) {
final int num = 1;
// int num = 1; // 即隐性的具有 final 的语义,不可修改
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2); // 输出结果为 3
// num++; // 编译错误
}
public interface Converter<T1, T2> {
void convert(int i);
}
Lambda表达式:变量作用域实例3-对应传参注意项3食用
/**
* Lambda 表达式中不允许声明一个与局部变量同名的参数或者局部变量
* @param args
*/
public static void main(String[] args) {
String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错
}
2.接口中增加默认(新增default方法修饰符)和静态方法
电脑没电,下次更。。。
参考:
runoob-菜鸟教程:Lambda表达式
官网java8-whats-new
https://github.com/shekhargulati/java8-the-missing-tutorial