java8新特性

java

Java8 新增了非常多的特性,我们主要讨论以下几个:

  • Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。

  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

  • Date Time API − 加强对日期与时间的处理。

  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

import java.util.Collections;

import java.util.List;

import java.util.ArrayList;

import java.util.Comparator;

public class Java8Tester {

public static void main(String args[]){

List<String> names1 = new ArrayList<String>();

names1.add("Google ");

names1.add("Runoob ");

names1.add("Taobao ");

names1.add("Baidu ");

names1.add("Sina ");

List<String> names2 = new ArrayList<String>();

names2.add("Google ");

names2.add("Runoob ");

names2.add("Taobao ");

names2.add("Baidu ");

names2.add("Sina ");

Java8Tester tester = new Java8Tester();

System.out.println("使用 Java 7 语法: ");

tester.sortUsingJava7(names1);

System.out.println(names1);

System.out.println("使用 Java 8 语法: ");

tester.sortUsingJava8(names2);

System.out.println(names2);

}

// 使用 java 7 排序

private void sortUsingJava7(List<String> names){

Collections.sort(names, new Comparator<String>() {

@Override

public int compare(String s1, String s2) {

return s1.compareTo(s2);

}

});

}

// 使用 java 8 排序

private void sortUsingJava8(List<String> names){

Collections.sort(names, (s1, s2) -> s1.compareTo(s2));

}

}

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

lambda 表达式的语法格式如下:

(parameters) -> expression 或 (parameters) ->{ statements; }

Lambda 表达式实例

Lambda 表达式的简单例子:

// 1. 不需要参数,返回值为 5  

() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值

x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值

(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和

(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)

(String s) -> System.out.print(s)

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

}

}

Java 8 Stream

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());

forEach

Stream 提供了新的方法 'forEach' 来迭代流中的每个数据。以下代码片段使用 forEach 输出了10个随机数

Random random = new Random();

random.ints().limit(10).forEach(System.out::println);

Map

map方法用于映射每个元素到对应的结果,一下代码片段使用map输出了元素的对应的平方数

List<Integer> numbers  = Arrays.asList(3,2,2,3,7,3,5);

//获取对应的平方数

List<Integer> squaresList = numbers.stream().map(i -> i*i).distinct().collect(Collectors.toList());

filter

List<String> strings = Arrays.asList("abc","","b","efg","abcd","","jk1");

//获取空字符串的数量

long count = Strings.stream().filter(string ->string.isEmpt()).count();

limit

limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 10 条数据:

Random random = new Random(); random.ints().limit(10).forEach(System.out::println);

sorted

sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序:

Random random = new Random(); random.ints().limit(10).sorted().forEach(System.out::println);

并行(parallel)程序

parallelStream 是流并行处理程序的代替方法。以下实例我们使用 parallelStream 来输出空字符串的数量:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); 

// 获取空字符串的数量
long count = strings.parallelStream().filter(string -> string.isEmpty()).count();

以上是 java8新特性 的全部内容, 来源链接: utcz.com/z/392877.html

回到顶部