Java8新特性

1 Lambda 表达式

lambda 表达式的语法格式如下:
    (parameters) -> expression
    或
    (parameters) ->{ statements; }
以下是lambda表达式的重要特征:

    1 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
    2 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
    3 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
    4 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量(因为内部无法识别2个变量)。

简单实例:

public class LambdaTest {
    String classVar = "hello ";
    public static void main(String[] args) {
        LambdaTest tester = new LambdaTest();

        // 类型声明
        MathOperation addition = (int a, int b) -> a + b;
        MathOperation sub = (int a, int b) -> a - b;
        System.out.println("10 + 5 = " + addition.operation(5,10));
        System.out.println("15 - 10 = " + sub.operation(15,10));


        String pre = "你好! ";
        /**
         *只能访问main方法内的成员变量pre,且pre必须为final或者程序后面不再对pre值做修改(隐形final)
         *如果要访问类成员变量classVar,需要把成员变量定义为static
         */
        SayHello sayHello = message -> System.out.println(pre + message);
        sayHello.say("小榕先生");

    }
    //接口定义
    interface MathOperation {
        int operation(int a, int b);
    }
    //接口定义
    interface SayHello {
        void say(String name);
    }
}
Lambda 表达式的使用前提:
必须有接口(不能是抽象类),接口中有且仅有一个需要被重写的抽象方法。
必须支持上下文推导,要能够推导出来 Lambda 表达式表示的是哪个接口中的内容。


2 方法引用

通过【类名::方法名】来进行使用

   或【对象:方法名】来进行使用


3 函数式接口


4 默认方法

interface B{
    void printHelloB(String  name);
    default void printHelloB2(String name){
        System.out.println("helloB2 " + name);
    }
}

通过default声明,使接口类可以有实现方法,他的实现着不需要再必须重写这个方法。

如果继承的多个接口,且有相同方法,则必须重写,否则编译器不知道使用哪儿个接口的默认方法


5 Stream

通过集合.stream()来获取流,如list.stream().XXXX

Stream(流)是一个来自数据源的元素队列并支持聚合操作.中间操作都会返回流对象本身,所以可以进行串联动作

通过lambda表达式来对流进行操作

1,numbers = new ArrayList(); numbers.stream().map( i -> i*i) //map对流内的元素进行改变,此处为流内元素变为本身的平方

2,strings.stream().filter(string -> string.isEmpty()).count();//filter 对集合进行过滤操作

3,random.ints().limit(10).forEach(System.out::println);//limit 限制接下来要操作的元素

4,random.ints().limit(10).sorted().forEach(System.out::println);//对流进行排序,sorted里面可以用lambda表达式来进行排序的改写

5,Collectors 可用于返回列表或字符串

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

String mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(", "));

6,统计int类型的集合

IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();

通过stats.getMax(),stats.getMin()等统计最大小值平均值等..


6 Optional 类

//感觉没啥太大用处,不做笔记


7 Nashorn, JavaScript 引擎

//java和script的互调,公司内部强调前后台分离,故也不做笔记

PS:既然是java8推出的,那肯定是有他的道理和作用的,只是本人暂时没法用


8 新的日期时间 API

java.time.*;修复jdk之前的非线程安全、时区及设计混乱的问题

1.对时间的处理变得更简单

2.增加了对时区的处理

暂时没用到,不做笔记
 

9 Base64编码

Base64.Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));

Base64.getUrlEncoder().encodeToString("runoob?java8".getBytes("utf-8"));

通过Base64调用其提供的静态方法对字符串进行编码和解码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-09-19 09:09  榕先生  阅读(6)  评论(0)    收藏  举报  来源