import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * Created by Administrator on 2017/8/19 0013.
 */
public class Test {
 /*************************************JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理*****************************/
 /**首先了解的几个概念:
  *     1.行为参数化:就是一个方法接受多个不同的行为作为参数,并在内部是使用它们,完成不同行为的能力,是一种可以帮助你处理频繁的需求变更的一种软件开发模式;
  *     2.匿名类:与我们所熟悉的java局部类差不多,但是匿名类没有名字,它允许你同事声明并实例化一个类(随用随建);
  *     3.ambda表达式:由参数,箭头和主体组成,如:(Apple a1,Apple a2)   ->    a1.getWeight().compareTo(a2.getWeight());
  *                                               ----lambda参数------  -箭头-  -------------lambda主体---------------
  * */
  //我们以实现从一个列表中筛选出绿苹果作为例子:
    //1.基础数据
    //创建苹果实体类
    class Apple{
        private String color;
        private double weight;
        public String getColor() {
            return color;
        }
        public void setColor(String color) {
            this.color = color;
        }
        public double getWeight() {
            return weight;
        }
        public void setWeight(double weight) {
            this.weight = weight;
        }

        public Apple(String color, double weight) {
            this.color = color;
            this.weight = weight;
        }
    }
    //2.由浅入深的实例:
    //初级做法:仅仅只能用于选出绿色的苹果
        public static List<Apple> chooseGreenApple(List<Apple> apples){
            List<Apple> result = new ArrayList<Apple>();//用于盛放筛选出来的绿苹果的集合
            for(Apple apple:apples){
                if("green".equals(apple.getColor())){//选出绿苹果放入到集合中
                    result.add(apple);
                }
            }
            return result;
        }
  //一级拓展:以颜色作为参数,可以根据参数选出想要的颜色的苹果
      public static List<Apple> choseAppleByColor(List<Apple> apples,String color){
          List<Apple> result = new ArrayList<Apple>();//用于盛放筛选出来的绿苹果的集合
          for(Apple apple:apples){
              if(color.equals(apple.getColor())){//根据参数选出所需要的苹果放入到集合中
                  result.add(apple);
              }
          }
            return result;
      }
  //二级拓展,对多个属性进行筛选(如颜色,重量)
        public static List<Apple> chooseApples(List<Apple> apples,String color, double weight,boolean flag){//谓词flag用于区分根据颜色还是根据重量筛选
            List<Apple> result = new ArrayList<Apple>();//用于盛放筛选出来的苹果的集合
            for(Apple apple:apples){
                //根据flag确定使用以哪个参数为依据来选出所需要的苹果放入到集合中
                if((flag && color.equals(apple.getColor())) || (!flag && apple.getWeight() > weight)){
                    result.add(apple);
                }
            }
            return result;
        }
    //三级拓展,根据抽象条件进行筛选:
        //定义一个接口来对选择标准建模:
        public interface  ApplePredicate{
            boolean test (Apple apple);
        }
        //以ApplePredicate的多个不同的实现来代表不同的选择标准
        //仅仅用来选出重的苹果
        public class AppleHeavy implements  ApplePredicate{
           public boolean test (Apple apple){
               return apple.getWeight() > 180;
           }
        }
        //如果仅仅用来选出绿色的苹果
        public class AppleColor implements  ApplePredicate{
            public boolean test (Apple apple){
                return "green".equals(apple.getColor());
            }
        }
        //在利用ApplePredicte改过之后,该方法就变成了这个样子,
        // 我们在使用的时候只需要创建不同个ApplePredicate对象,将他传递给chooseApples方法即可,大大的增加了他的灵活性
        public static List<Apple> chooseApples(List<Apple> apples, ApplePredicate predicate){
            List<Apple> result = new ArrayList<Apple>();//用于盛放筛选出来的苹果的集合
            for(Apple apple:apples){
                if(predicate.test(apple)){
                    result.add(apple);
                }
            }
            return result;
        }
    //终极超级酷炫拓展,将List类型抽象化
        public interface  predicatre<T>{
            boolean test(T t);
        }
         public static <T> List<T> chooseSomeThind(List<T> list, Predicate<T> p){
             List<T> result = new ArrayList<T>();
             for(T e:list){
                 if(p.test(e)){
                     result.add(e);
                 }
             }
            return result;
         }
    @org.junit.Test
    public void testChooseAppleByWhatYouWant(){
        //创建集合:
        List<Apple> appleList = Arrays.asList(new Apple("green",200),new Apple("red",150));
        //初级做法:仅仅只能用于选出绿色的苹果
            List<Apple> greenApples__1 = chooseGreenApple(appleList);
        //一级拓展:以颜色作为参数,可以根据参数选出想要的颜色的苹果
            //例如筛选出红苹果:
            List<Apple> greenApples__2 = choseAppleByColor(appleList,"red");
        //二级拓展,对多个属性进行筛选(如颜色,重量)
            //例如筛选出红苹果:
            List<Apple> greenApples__13 = chooseApples(appleList,"red",0,true);
            //例如筛选出重苹果:
            List<Apple> weightApples__1 = chooseApples(appleList,"",180,false);
        //三级拓展,根据抽象条件进行筛选:
            //例如筛选出绿苹果:
            List<Apple> greenApples = chooseApples(appleList,new AppleColor());
            //例如筛选出重苹果:
            List<Apple> weightApples_1 = chooseApples(appleList,new AppleHeavy());
        //四级拓展,使用匿名类同时声明和实例化一个类:(可以让你无需事先实例化,随用随建,提高效率)
            List<Apple> weightApples_2 = chooseApples(appleList, new ApplePredicate() {
                public boolean test(Apple apple) {return apple.getWeight() > 180;}
            });
        //五级拓展,使用lambda表达式:(显得更加干净整洁)
        //选出绿色的苹果
           List<Apple> weightApples_3 = chooseApples(appleList,(Apple apple) -> "green".equals(apple.getColor()));
        //终极超级酷炫拓展,将List类型抽象化:
            //类型抽象化后,你可以广泛的推广了,可以用在西瓜上,汽车上,Integer,String。。。。。。。。。。。。
             //例如:筛选出集合中包含“e”的单词集合:
             List<String> stringList = Arrays.asList("one","two","three","four");
             List<String> include_e = chooseSomeThind(stringList,(String str)-> str.contains("e"));
            //例如:筛选出集合中大于5的数字的集合:
            List<Integer> integersList = Arrays.asList(1,2,3,4,5,6,7,8,10);
            List<Integer> bigerThan_5 = chooseSomeThind(integersList,(Integer a)-> a>5);
            System.out.print("非常完美!");
    }

}

转自:https://blog.csdn.net/qq_37107280/article/details/77417500

JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理的更多相关文章

  1. Java 匿名类和lambda表达式

    一.匿名内部类 一个匿名内部类是一个没有名字的内部类.它将进一步定义一个内部类以及创建一个内部类的实例. 内部类处理器可以使用匿名内部类进行代码简化. 匿名内部类的语法如下所示: new SuperC ...

  2. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)

    2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...

  3. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  4. C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质

    前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...

  5. C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...

  6. 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  7. (转)C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  8. [No0000134]C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

  9. 【转】C#中的委托,匿名方法和Lambda表达式

    简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...

随机推荐

  1. WMS工作原理

    图1:创建窗口 图2:通信过程 我们知道其实任何一个窗口的创建,最终都是会创建一个 ViewRootImpl对象.ViewRootImpl 是一很重要的类,类似 ActivityThread 负责跟A ...

  2. mysql严格模式的开启、关闭

    关于mysql严格模式的开启.关闭 由于项目中对一些默认值设置问题,以及种种原因,mysql数据库需要使用非严格模式开发(mysql最近的版本默认是开启严格模式的). linux下mysql服务下操作 ...

  3. java Builder模式创建不可变类

    package com.geostar.gfstack.operationcenter.logger.manager.common; /** * Created by Nihaorz on 2017/ ...

  4. windows新增/修改/删除系统环境变量bat示例,一键配置JAVA_HOME

    setx JAVA_HOME "C:\Program Files\java\jdk1.6.0_27" /m setx classpath = ".;%JAVA_HOME% ...

  5. kubernetes 利用label标签来绑定到特定node运行pod

    利用label标签来绑定到特定node运行pod: 不如将有大量I/O的pod部署到配置了ssd的node上或者需要使用GPU的pod部署到某些安装了GPU的节点上 查看节点的标签: kubectl ...

  6. Codeforces Round #424 Div. 1

    A:二分答案,从左往右考虑每个人,选尽量靠左的钥匙即可. #include<iostream> #include<cstdio> #include<cmath> # ...

  7. Hat’s Words HDU - 1247 字典树

    题意:给出数个单词 输出单词 如果该单词 是由字典中的单词组成的 思路:字典树 先把全部建树  然后对于每一个单词进行分割,分别拿两半到字典树里面去找 小心RE! #include<bits/s ...

  8. CSAPC2008 skyline

    一座山的山稜线由许多片段的45度斜坡构成,每一个片段不是上坡就是下坡. *    *   *  /\*  /\  /\/   \/\/  \/        \ 在我们眼前的所见的任何宽度为n个单位的 ...

  9. 【XSY2719】prime 莫比乌斯反演

    题目描述 设\(f(i)\)为\(i\)的不同的质因子个数,求\(\sum_{i=1}^n2^{f(i)}\) \(n\leq{10}^{12}\) 题解 考虑\(2^{f(i)}\)的意义:有\(f ...

  10. 【转载】docker 应用之动态扩展容器空间大小

    docker 容器默认的空间是 10G, 如果想指定默认容器的大小(在启动容器的时候指定),可以在 docker 配置文件里通过 dm.basesize 参数指定,比如 docker -d --sto ...