Java8新特性

mtain 2019年03月07日 678次浏览

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应用。

Lambda表达式

/**
 * Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
 * Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
 * 使用 Lambda 表达式可以使代码变的更加简洁紧凑。
 */
public class LambdaDemo {
    public static void main(String[] args) {
        // 不使用Lambda
        IAction iAction0 = new IActionImpl();
        iAction0.exec("0","A");
        // 使用匿名内部类
        IAction iAction1 = new IAction() {
            @Override
            public boolean exec(String name, String type) {
                System.out.println("exec......"+name+"......"+type);
                return false;
            }
        };
        iAction1.exec("1", "B");

        // 使用Lambda表达式
        IAction iAction2 = (String name,String type) -> {
            System.out.println("exec......"+name+"......"+type);
            return false;
        };
        iAction2.exec("L2", "LC");

        /**
         * 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
         * 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
         * 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
         * 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
         */
        IAction iAction3 = (name,type) -> true;
        boolean exec3 = iAction3.exec("L3", "LD");
        System.out.println("L3-----返回:"+exec3);



    }
}

// 接口中有且只有一个方法
interface IAction{
    public boolean exec(String name,String type);
}

class IActionImpl implements IAction{
    @Override
    public boolean exec(String name, String type) {
        System.out.println("exec......"+name+"......"+type);
        return false;
    }
}

Stream

Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;

public class StreamDemo {
    public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd",null, "jkl");

        /**
         * 创建流的两个方法
         * stream() − 为集合创建串行流。
         * parallelStream() − 为集合创建并行流。
         */

        // filter条件过滤出元素 过滤掉为null或空的对象
        List<String> filtered = strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.toList());

        // forEach迭代流中的数据
        filtered.stream().forEach(System.out::println);

        // map映射每个元素对应的结果
        filtered.stream().map(str->"Map映射数据:"+str).forEach(System.out::println);

        // limit获取指定数量的流
        filtered.stream().limit(2).map(str->"limit获取指定数量的流--1:"+str).forEach(System.out::println);
        filtered.stream().limit(2).map(str->"limit获取指定数量的流--2:"+str).forEach(System.out::println);
        // sorted对流进行排序
        filtered.stream().sorted().map(str->"sorted对流进行排序:"+str).forEach(System.out::println);

        // 使用parallel并行流获取空串数量 考虑元素为null报错情况
        long count = strings.parallelStream().filter(string ->  string!=null).filter(string -> string.isEmpty()).count();
        System.out.println("用parallel并行流获取空串数量:"+count);

        // Collectors归纳操作
        strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.toList());
        String mergedString = strings.stream().filter(string -> string!=null&&!string.isEmpty()).collect(Collectors.joining(", "));
        System.out.println("合并字符串: " + mergedString);


        // 统计
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
        System.out.println("列表中最大的数 : " + stats.getMax());
        System.out.println("列表中最小的数 : " + stats.getMin());
        System.out.println("所有数之和 : " + stats.getSum());
        System.out.println("平均数 : " + stats.getAverage());
    }
}