jdk1.8特性Lambda表达式认识(Predicate接口)

5 篇文章 0 订阅
5 篇文章 0 订阅

jdk在升级的过程中,让程序代码变得更加简洁。引入的lambda表达式,简明扼要的语法来表达某种功能所包含的操作,常用在程序遍历访问集合中元素的场合。
(以下内容引用文献:OCA JavaSE 8程序员认证考试指南 Exam 1Z0-808 第6章 6.6 使用简单的lambda表达式-OCA考点9.5)

一 、案例

1 新建Dog类

属性:昵称、年龄、重量

2 新建测试类

public class TestDogs {
   public static void main(String[] args) {
      ArrayList<Dog> dogs = new ArrayList<>();
      dogs.add(new Dog("boi",30,6));
      dogs.add(new Dog("charis",120,7));
      dogs.add(new Dog("clover",35,12)); 

  System.out.println("all dogs "+dogs);
  //测试一  普通两个查询方法
  System.out.println("min age 7 "+minAge(dogs,7));
  System.out.println("max weight "+maxWeight(dogs,40));
  //测试二  lambda测试(通用方法)
  System.out.println("lam min age 7 "+dogQuerrier(dogs,d->d.getAge()>=7));
  System.out.println("lam max weight "+dogQuerrier(dogs,f->f.getWeight()<40));

   }
   //第一步 两个查询方法
   //查询年龄的方法
   static ArrayList<Dog> minAge(ArrayList<Dog> dogList,int testFor){
      ArrayList<Dog> result1 = new ArrayList<>();
      for (Dog dog : dogList) {
         if (dog.getAge() >=testFor ){
            result1.add(dog);
         }
      }
      return result1;
   }
   //查询体重的方法
   static ArrayList<Dog> maxWeight(ArrayList<Dog> dogList,int testFor){
      ArrayList<Dog> result2 = new ArrayList<>();
      for (Dog dog : dogList) {
         if (dog.getWeight() <= testFor){
            result2.add(dog);
         }
      }
      return result2;
   }
   //第二步 采用lambda  通用方法
   static ArrayList<Dog> dogQuerrier(ArrayList<Dog> dogList, Predicate<Dog> expr){
      //即时查询
      ArrayList<Dog> lamRes = new ArrayList<>();
      for (Dog dog : dogList) {
         if (expr.test(dog)){
            lamRes.add(dog);
         }
      }
      return lamRes;
   }
}

Predicate接口有一些新引进的static和default接口方法,最重要的是它有一个抽象方法test()方法,返回布尔值。

二、语法规则
import java.util.function.Predicate;

/**

  • Predicate lambda详细语法规则
  • 参数只能是变量名,或是后面跟变量名的类型,而且都在圆括号中
  • 主体必须返回布尔值
  • 主体可以是一个单一的表达式,这时不能包含return语句
  • 主体可以是一个有花括号包围的代码块,其中可以包含一条或多条语句,每一条语句以分号结尾,代码块必须以return语句结尾
    */
public class LambDemo2 {
   public static void main(String[] args) {
      LambDemo2 lam1 = new LambDemo2();
      //合法的lambda
      lam1.go(x->7<5);
      //lam1.go(y->10>5);
      lam1.go((LambDemo2 z)->{int x = 2;return adder(2,7)>8;});
      lam1.go(z->{int x = 2;return adder(2,7)>8;});
      int a = 6;int b =5;
      lam1.go(x->{return adder(a,b)>8;});  //局部变量
      lam1.go(x->adder(a,b)>8);     //无代码块

      //非法的lambda
      //lam1.go(x -> return adder(2,1) > 5;); // 返回w/o代码块
      //lam1.go(LambDemo2 x -> adder(2,3) > 7); //类型需要圆括号
      //lam1.go(()->adder(2,3)>7);  //Predicate需要一个参数
      //lam1.go(x ->{adder(2,3) > 9});  //代码块中需要的是语句
      //lam1.go(x ->{adder(3,4) > 7;}); //需要return语句
   }
   void go(Predicate<LambDemo2> e){
      LambDemo2 m2 = new LambDemo2();
      System.out.println(e.test(m2)?"ternary true":"ternary false");
   }
   static int adder(int x,int y){
      return x+y;
   }
}

关于lambda表达式的知识,会在其他页面介绍。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰少2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值