zoukankan      html  css  js  c++  java
  • Java8新特性(一)之Lambda表达式

    1.Java8新特性简介

      java8是Oracle公司在2014年3月18日发布的

      速度更快、代码更少(增加了新的语法Lambda表达式)、强大的Stream API、便于并行、最大化减少空指针异常

    2.Java8包含的主要内容:

      1)Lambda表达式

        Lambda表达式允许将函数作为参数进行传递,免去了使用匿名函数

      2)函数式接口

        在一个接口中之定义一个特定功能的方法。

      3)方法引用和构造器引用

        可以直接引用类或对象的方法或构造器。与Lambda联合使用,减少代码的冗余度,使代码更见紧凑简介。

      4)Stream API

        加强了对集合的各种操作,极度的方便开发

      5)接口中默认方法和静态方法

      6)新时间日期API

        加强对日期的处理

      7)其他特性

    3.Lambda表达式的使用

      语法:

      新的操作符: 【->】,它将表达式分为两部分。

        左侧:指定Lambda表达式需要的参数;

        右侧:指定Lambda体,即Lambda表达式需要执行的功能。

      1)与平常使用的匿名函数的比较

      案例比较一(无参)

    package com.hxc.lambda;
    
    /**
     * sun_flower
     */
    public class Java8Test {
    
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.printf(" Hello World!
     --来自普通函数的呼喊");
                }
            };
            runnable.run();
            Runnable rn = () -> System.out.println("
     
     Hello World!!! 
     --来自Java8新特性的呼唤");  //这里的()即为左侧 空参; -> 后的为右侧,整个要表达的逻辑功能
            rn.run();
        }
    }

      案例比较二(有参)

    package com.hxc.lambda;
    
    import java.util.Comparator;
    import java.util.TreeSet;
    
    /**
     * sun_flower
     */
    public class Java8Test {
    
        public static void main(String[] args) {
            TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return Integer.compare(o1.length(), o2.length());
                }
            });
            TreeSet<String> newTreeSet = new TreeSet<>(
                    (o1, o2) -> {   //能够自动推断参数类型,当然也可以写上参数类型
                        return Integer.compare(o1.length(), o2.length());
                    });
        }
    }

      2) Lambda表达式只能引用外部带有final的外层局部变量,这意味着在Lambda体中不能修改该局部变量。

        (如果在外部没有声明为final,且未曾改变该变量,则默认是final类型;如果修改过,则会报错)

      案例:

      //接口部分

    package com.hxc.myInterface;
    
    @FunctionalInterface
    public interface MathOperation {
        int operation(int a, int b);
    }
    package com.hxc.lambda;
    
    import com.hxc.myInterface.MathOperation;
    
    /**
     * sun_flower
     */
    public class TestMathOperation {
    
        public static void main(String[] args) {
            int c = 1;  //在Lambda表达式中使用了该变量,则默认为final类型
    //        c = c + 1;    //放开注释,则会报错
            MathOperation mo = (a, b) -> a + b + c; //使用局部变量c
            MathOperation mo2 = (a, b) -> a - b;
            MathOperation mo3 = (a, b) -> {return a * b;};  //使用大括号
            MathOperation mo4 = (a, b) -> a / b;
            printMathOper(4, 2, mo);
        }
    
        public static void printMathOper(int a, int b, MathOperation mo) {
            System.out.println(mo.operation(a, b));;
        }
    }

      

  • 相关阅读:
    powerdesigner简单使用
    linux进程间通信方式
    linux中fork()函数详解(原创!!实例讲解)
    platform_device与platform_driver
    当心不静的时候
    linux移植简介[MS2]
    使用maven的tomcat:run进行web项目热部署
    SpringMVC &amp; Struts2
    开放产品开发(OPD):OPD框架
    【Android个人理解(八)】跨应用调用不同组件的方法
  • 原文地址:https://www.cnblogs.com/sun-flower1314/p/11258176.html
Copyright © 2011-2022 走看看