zoukankan      html  css  js  c++  java
  • 《JAVA8实战》读书笔记之传递方法和传递lambda

    传递方法:

    假设 你有一个Apple类,它 有一个getColor方法,还有一个变量inventory保存着一个Apples的列表。你可能想要选出所 有的绿苹果,并返回一个列表。通常我们用筛选(filter)一词来表达这个概念。在Java 8之前, 你可能会写这样一个方法filterGreenApples:

     1 public static List<Apple> filterGreenApples( List<Apple> inventory )
     2 {
     3     List<Apple> result = new ArrayList<>(); for ( Apple apple : inventory )
     4     {
     5         if ( "green".equals( apple.getColor() ) )
     6         {
     7             result.add( apple );
     8         }
     9     }
    10     return(result);
    11 }

    但是接下来,有人可能想要选出重的苹果,比如超过150克: 

     public static List<Apple> filterHeavyApples( List<Apple> inventory )
    {
         List<Apple> result = new ArrayList<>();
         for ( Apple apple : inventory )
         {
            if ( apple.getWeight() > 150 )
            {
                 result.add( apple );
             }
         }
         return(result);
     }

    这 两个方法只有一行不同: if里面高亮的那行条件。

    Java 8你可以这样写:

     1 public static boolean isGreenApple( Apple apple )
     2 {
     3     return("green".equals( apple.getColor() ) );
     4 }
     5 
     6 
     7 public static boolean isHeavyApple( Apple apple )
     8 {
     9     return(apple.getWeight() > 150);
    10 }
    11 
    12 
    13 public interface Predicate<T>{ 
    14     boolean test( T t ); 
    15 } 
    16 
    17 static List<Apple> filterApples( List<Apple> inventory, Predicate<Apple> p )
    18 {
    19     List<Apple> result = new ArrayList<>();
    20     for ( Apple apple : inventory )
    21     {
    22         if ( p.test( apple ) )
    23         {
    24             result.add( apple );
    25         }
    26     }
    27     return(result);
    28 }        

    要用它的话,你可以写: 

    1 filterApples(inventory, Apple::isGreenApple);
    2 或者 
    3 filterApples(inventory, Apple::isHeavyApple);

    注:

    什么是谓词? 前 面 的 代 码 传 递 了 方 法 Apple::isGreenApple ( 它 接 受 参 数 Apple 并 返 回 一 个 boolean)给filterApples,后者则希望接受一个Predicate<Apple>参数。谓词(predicate)它接受一个参数值,并返回true或false。你 在后面会看到, Java 8也会允许你写Function<Apple,Boolean>,但用Predicate<Apple>是更标准的方式,效率也会更高一 点儿,这避免了把boolean封装在Boolean里面

     

    传递 Lambda

    把方法作为值来传递显然很有用,但要是为类似于isHeavyApple和isGreenApple这种可能只用一两次的短方法写一堆定义有点儿烦人。不过Java 8也解决了这个问题,它引入了一套新
    记法(匿名函数或Lambda),让你可以写

    filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) );

    或者

    filterApples(inventory, (Apple a) -> a.getWeight() > 150 );

    甚至

    filterApples(inventory, (Apple a) -> a.getWeight() < 80 || "brown".equals(a.getColor()) );


    所以,你甚至都不需要为只用一次的方法写定义;代码更干净、更清晰,因为你用不着去找自己到底传递了什么代码。但要是Lambda的长度多于几行(它的行为也不是一目了然)的话,那你还是应该用方法引用来指向一个有描述性名称的方法,而不是使用匿名的Lambda。你应该以代码的清晰度为准绳。

  • 相关阅读:
    解析“0”的读法
    CM3 支持 64 位整数, LDRD STRD
    segger usbh struct
    BCM2046 Bluetooth on new 8,3 MacBook Pro USB Interface Descriptor bAlternateSetting
    STM32 USB Host Library 学习笔记 (2) USBH_InterruptSendData() USBH_ClrFeature()
    Double Link List
    汉语拼音方案里的O(哦)和 UO(窝)
    git commit 时,会打开默认的文本编辑器,要求你输入提交信息
    WIN7 常见问题及解决方法
    git 创建 .gitignore 文件 建立项目过滤规则
  • 原文地址:https://www.cnblogs.com/jimboi/p/8318047.html
Copyright © 2011-2022 走看看