目录
一、Java 8 Lambda 表达式
1.1 语法
1.2 Lambda 表达式实例(常见)
二、Java 8 Stream
2.1 什么是 Stream?
2.2生成流
2.3 forEach
2.4 map
2.5 filter
2.6 limit
2.7 sorted
2.8 并行(parallel)程序
2.9 Collectors
2.10 统计
2.11 其他还有
2.12 Stream 综合实例
三、Java 8 方法引用
3.1方法引用
3.2方法引用实例
四、Java 8 函数式接口
4.1 JDK 1.8 新增加的函数接口
4.2 函数式接口实例
五、Java 8 默认方法
5.1语法
5.2多个默认方法
5.3 静态默认方法
5.4 默认方法实例
六、Java 8 日期时间 API
6.1 本地化日期时间 API
6.2 使用时区的日期时间API
七、Java 8 Optional 类
7.1类声明
7.2 类方法
7.3 Optional 实例
八、Java 8 Nashorn JavaScript
8.1 jjs
8.2 jjs 交互式编程
8.3 传递参数
8.4 Java 中调用 JavaScript
8.5 JavaScript 中调用 Java
九、Java8 Base64
9.1 内嵌类
9.2 方法
9.3 Base64 实例
一、Java 8 Lambda 表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用Lambda 表达式可以使代码变的更加简洁紧凑。
1.1 语法
lambda 表达式的语法格式如下:
(parameters) -> expression或(parameters) ->{statements; }
以下是lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值;
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号;
可选的大括号:如果主体包含了一个语句,就不需要使用大括号;
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
1.2 Lambda 表达式实例(常见)
(1)用lambda表达式实现Runnable
Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递),其可以代替实现 “接口” 中的抽象方法时的书写匿名内部类的繁琐代码。
Runnable run = new Runnable() { @Override public void run() { System.out.println("old run"); } }; run.run();
该代码可以使用lambda表达式简化为:
Runnable run1 = () -> System.out.println("lambda run");
run1.run();
(2)使用lambda表达式对列表进行迭代
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
features.forEach(System.out::println);
(3)使用lambda表达式和函数式接口Predicate,适合用于过滤;
同时它提供类似于逻辑操作符AND和OR的方法,名字叫做and()、or()和xor(),用于将传入 filter() 方法的条件合并起来
List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
names.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("nName, which starts with 'J' and four letter long is : " + n));
(4)使用lambda表达式的Map和Reduce
List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); costBeforeTax.stream().map((cost) -> cost + .12*cost).forEach(System.out::println); double totalBill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();
(5)通过过滤创建一个String列表
// 创建一个字符串列表,每个字符串长度大于2 List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList()); // 将字符串换成大写并用逗号链接起来 String G7Countries = strList.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", ")); (更多相关用法详见stream用法)
(6)综合实例
public class Java8Tester { public static void main(String args[]) { Java8Tester tester = new Java8Tester(); // 类型声明 MathOperation addition = (int a, int b) -> a + b; // 不用类型声明 MathOperation subtraction = (a, b) -> a - b; // 大括号中的返回语句 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 没有大括号及返回语句 MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); // 不用括号 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 用括号 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=15
10-5=5
10 x 5=50
10/5=2
HelloRunoob
HelloGoogle