1.lambda演示
1)传统方式获取Java数据
public static void main(String[] args) {
Comparator
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);//核心代码
}
};
TreeSet
}
2)lambda获取数据的方式
//Lambda表达式
public void Test2(){
/*
(x,y) -> Integer.compare(x, y);//lanbdm表达式实现方式:com存在实现实例
通过该方式,替换上面对于核心代码的实现
*/
Comparator
TreeSet
}
2.传统方式演示及优化
1)传统获取数据方式写多个方法获取数据
class Emplyee{ }
//示例①,如果想要找出工资大于等于4000的员工
/*@org.junit.Test
public List
List
for (Emplyee e : list) {
if(e.getSalary()>=5000){
ems.add(e);
}
}
return ems;
}*/
//示例①,如果想要找出年龄大于等于50的员工
public List
List
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
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
List
for (Emplyee emplyee : lie) {
System.out.println(emplyee);
}
}
//策略模式
public List
List
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
List
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.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
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
System.out.println("函数式接口");
return Integer.compare(x, y);
};
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);
二、Lambda 表达式需要“函数式接口”的支持
函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰
* 可以检查是否是函数式接口
閱讀更多 源碼時代 的文章