028-86261949

当前位置:首页 > 技术交流 > Java8特性之lambda表达式

Java8特性之lambda表达式

2018/06/12 18:04 分类: 技术交流 浏览:145

1. lambda演示

1) 传统方式获取Java数据

public static void main(String[] args) {
                Comparator<Integer> com = new Comparator<Integer>() {
                        @Override
                        public int compare(Integer o1, Integer o2) {
                                return o1.compareTo(o2);//核心代码
                        }
                };
                TreeSet<Integer> ts = new TreeSet<>(com);
        }


2) lambda获取数据的方式

//Lambda表达式
public void Test2(){
     /*
(x,y) -> Integer.compare(x, y);//lanbdm表达式实现方式:com存在实现实例
       通过该方式,替换上面对于核心代码的实现
     */
Comparator<Integer> com = (x,y) -> Integer.compare(x, y);//lanbdm表达式实现方式:com存在实现实例
TreeSet<Integer> ts = new TreeSet<Integer>(com);
}


2.传统方式演示及优化

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

class Emplyee{   }
//示例①,如果想要找出工资大于等于4000的员工
/*@org.junit.Test
public List<Emplyee> Test1(){
List<Emplyee> ems = new ArrayList<>();
for (Emplyee e : list) {
if(e.getSalary()>=5000){
ems.add(e);
}
}
         return ems;
}*/
//示例①,如果想要找出年龄大于等于50的员工
public List<Emplyee> Test2(){
List<Emplyee> ems = new ArrayList<>();
for (Emplyee e : list) {
if(e.getAge()>=50){
ems.add(e);
}
}
return ems;
}
问题:发现核心代码只有一小部分,冗余度太高


2) 优化方式①策略模式

class Emplyee{}
public interface Compare<T>{
boolean compare(T e);
}
public class MyCompartorAge implements Compare<Emplyee>{
@Override
public boolean compare(Emplyee e) {
return e.getAge()>=50;
}
}
public class MyCompartorSalary implements Compare<Emplyee> {
@Override
public boolean compare(Emplyee e) {
// TODO Auto-generated method stub
return e.getSalary()>=5000;
}
}
public class Test {
List<Emplyee> 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<Emplyee> lie = test1(list,new MyCompartorAge());
List<Emplyee> lir = test1(list,new MyCompartorSalary());
for (Emplyee emplyee : lie) {
System.out.println(emplyee);
}
}
//策略模式
public List<Emplyee> test1(List<Emplyee> list ,Compare<Emplyee> mc){
List<Emplyee> 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<T>{
boolean compare(T e);
}
public class MyCompartorAge implements Compare<Emplyee>{
@Override
public boolean compare(Emplyee e) {
return e.getAge()>=50;
}
}
public class MyCompartorSalary implements Compare<Emplyee> {
@Override
public boolean compare(Emplyee e) {
return e.getSalary()>=5000;
}
}
// 优化方式匿名内部类
@org.junit.Test
public void test() {
test(list, new Compare<Emplyee>() {
@Override
public boolean compare(Emplyee e) {
return e.getAge() >= 50;
}
});
test(list, new Compare<Emplyee>() {
@Override
public boolean compare(Emplyee e) {
return e.getSalary() >= 5000;
}
});
    //定义的方法
public List<Emplyee> test1(List<Emplyee> list ,Compare<Emplyee> mc){
List<Emplyee> 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<Emplyee> 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<Emplyee> test(List<Emplyee> list, Compare<Emplyee> cm) {
ArrayList<Emplyee> al = new ArrayList<Emplyee>();
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<Integer> com = (x, y) -> {
                         System.out.println("函数式接口");
                         return Integer.compare(x, y);
                 };
语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
                  Comparator<Integer> com = (x, y) -> Integer.compare(x, y);  
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
                  (Integer x, Integer y) -> Integer.compare(x, y);

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

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

 

   感谢源码时代教学讲师提供此文章!
   本文为原创文章,转载请注明出处!
 
#标签:Java,lambda表达式