了解Java8特性之lambda表达式

1.lambda演示

1)传统方式获取Java数据

public static void main(String[] args) {

Comparator com = new Comparator() {

@Override

public int compare(Integer o1, Integer o2) {

return o1.compareTo(o2);//核心代码

}

};

TreeSet ts = new TreeSet<>(com);

}

2)lambda获取数据的方式

//Lambda表达式

public void Test2(){

/*

(x,y) -> Integer.compare(x, y);//lanbdm表达式实现方式:com存在实现实例

通过该方式,替换上面对于核心代码的实现

*/

Comparator com =(x,y) -> Integer.compare(x, y);//lanbdm表达式实现方式:com存在实现实例

TreeSet ts = new TreeSet(com);

}

2.传统方式演示及优化

1)传统获取数据方式写多个方法获取数据

class Emplyee{ }

//示例①,如果想要找出工资大于等于4000的员工

/*@org.junit.Test

public List Test1(){

List ems = new ArrayList<>();

for (Emplyee e : list) {

if(e.getSalary()>=5000){

ems.add(e);

}

}

return ems;

}*/

//示例①,如果想要找出年龄大于等于50的员工

public List Test2(){

List ems = new ArrayList<>();

for (Emplyee e : list) {

if(e.getAge()>=50){

ems.add(e);

}

}

return ems;

}

问题:发现核心代码只有一小部分,冗余度太高

2)优化方式①策略模式

class Emplyee{}

public interface Compare{

boolean compare(T e);

}

public class MyCompartorAge implements Compare{

@Override

public boolean compare(Emplyee e) {

return e.getAge()>=50;

}

}

public class MyCompartorSalary implements Compare {

@Override

public boolean compare(Emplyee e) {

// TODO Auto-generated method stub

return e.getSalary()>=5000;

}

}

public class Test {

List list = Arrays.asList(

new Emplyee("张三",18,6666.999),

new Emplyee("王五",19,2222.999),

new Emplyee("李四",30,7777.999),

new Emplyee("马六",48,5555.999),

new Emplyee("周七",88,9999.999),

new Emplyee("王八",20,4444.999),

new Emplyee("二狗",69,3333.999)

);

@org.junit.Test

public void test(){

List lie = test1(list,new MyCompartorAge());

List lir = test1(list,new MyCompartorSalary());

for (Emplyee emplyee : lie) {

System.out.println(emplyee);

}

}

//策略模式

public List test1(List list ,Compare mc){

List li = new ArrayList<>();

for (int i = 0; i < list.size(); i++) {

if(mc.compare(list.get(i))){

li.add(list.get(i));

}

}

return li;

}

}

3)优化方式①匿名内部类

class Emplyee{}

public interface Compare{

boolean compare(T e);

}

public class MyCompartorAge implements Compare{

@Override

public boolean compare(Emplyee e) {

return e.getAge()>=50;

}

}

public class MyCompartorSalary implements Compare {

@Override

public boolean compare(Emplyee e) {

return e.getSalary()>=5000;

}

}

// 优化方式匿名内部类

@org.junit.Test

public void test() {

test(list, new Compare() {

@Override

public boolean compare(Emplyee e) {

return e.getAge() >= 50;

}

});

test(list, new Compare() {

@Override

public boolean compare(Emplyee e) {

return e.getSalary() >= 5000;

}

});

//定义的方法

public List test1(List list ,Compare mc){

List li = new ArrayList<>();

for (int i = 0; i < list.size(); i++) {

if(mc.compare(list.get(i))){

li.add(list.get(i));

}

}

return li;

}

}

4)优化方式④Lanbda及Stream API演示

// 优化方式lambd表达式

@org.junit.Test

public void test(){

List lis = test(list,(e) -> e.getSalary() >= 5000);

lis.forEach(System.out::println);

System.out.println("888888888888888888888888888888888888888888");

}

//优化方式Stream API

@org.junit.Test

public void test1(){

list.stream()

.filter((e) -> e.getSalary()>=5000)

.limit(2)

.forEach(System.out::println);

}

public List test(List list, Compare cm) {

ArrayList al = new ArrayList();

for (int i = 0; i < list.size(); i++) {

if (cm.compare(list.get(i))) {

al.add(list.get(i));

}

}

return al;

}

3.Lambda基础语法

一、Lambda 表达式的基础语法:

Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符

箭头操作符将 Lambda 表达式拆分成两部分:本质是对接口的一种实现

左侧:Lambda 表达式的参数列表

右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体

语法格式一:无参数,无返回值

() -> System.out.println("Lambda! See you");

语法格式二:有一个参数,并且无返回值

(x) -> System.out.println(x)

语法格式三:若只有一个参数,小括号可以省略不写

x -> System.out.println(x)

语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

Comparator com = (x, y) -> {

System.out.println("函数式接口");

return Integer.compare(x, y);

};

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

Comparator com = (x, y) -> Integer.compare(x, y);

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

(Integer x, Integer y) -> Integer.compare(x, y);

二、Lambda 表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰

* 可以检查是否是函数式接口

了解Java8特性之lambda表达式


分享到:


相關文章: