Java8新特性(一)之Lambda表达式

时间:2023-12-23 12:04:02

.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); border-top-left-radius: 7px; border-top-right-radius: 7px; color: rgba(255, 255, 255, 1); height: 1.8em; line-height: 1.8em; padding: 5px }

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!\n --来自普通函数的呼喊");
}
};
runnable.run();
Runnable rn = () -> System.out.println("\n \n Hello World!!! \n --来自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));;
}
}