【Java基础】java8新特性

引子:闲览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

猜你喜欢

转载自blog.csdn.net/guodonggang/article/details/81100432