通过行为参数传递代码
2017-10-02 14:39
387 查看
一、概述
1.1、行为参数化的含义:让方法接受多种行为作为参数,并在内部使用,来完成不同行为。1.2、案例:我们要得到重量大于150克的苹果和所有的绿苹果。
二、代码实现
2.1 行为参数化package com.jdk.test; public class Apple { private String color; private int weight; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public Apple(String color, int weight) { super(); this.color = color; this.weight = weight; } @Override public String toString() { return "Apple [color=" + color + ", weight=" + weight + "]"; } }
package com.jdk.test; /** * * @author Administrator *策略模式的应用 *行为参数化:让方法接受多种行为作为参数,并在内部使用,来完成不同的行为。 */ public interface ApplePredicate { boolean test(Apple apple); }
package com.jdk.test; public class AppleGreenColorPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { //选出绿色的苹果 return "green".equals(apple.getColor()); } }
package com.jdk.test; public class AppleHeavyWeightPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { //选出大于150克的苹果 return apple.getWeight() > 150; } }
package com.jdk.test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FilteringApples { public static void main(String[] args) { List<Apple> inventory = Arrays.asList(new Apple("green",80), new Apple("red",190), new Apple("green",100)); List<Apple> heavryApples = filterApples(inventory,new AppleHeavyWeightPredicate()); heavryApples.forEach(Apple -> System.out.println("输出重量大于150克"+Apple.toString())); List<Apple> greenApples = filterApples(inventory,new AppleGreenColorPredicate()); greenApples.forEach(Apple -> System.out.println("输出绿色的Apple"+Apple.toString())); } public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p) { List<Apple> result=new ArrayList<>(); for (Apple apple : inventory) { if(p.test(apple)){ result.add(apple); } } return result; } }以上是我们使用行为参数化来实现的需求,下面我们来看下使用匿名内部类的实现方式:
List<Apple> redApples = filterApples(inventory,new ApplePredicate() { @Override public boolean test(Apple apple) { return "red".equals(apple.getColor()); } }); redApples.forEach(Apple ->System.out.println("输出红色Apple"+Apple.toString()));
使用了匿名内部类并没有让我们感到代码的简洁和易读,我们再对上面的代码进行改造。
2.2使用Lambda表达式
List<Apple> greenApples = filterApples(inventory, (Apple apple) -> "green".equals(apple.getColor())); greenApples.forEach(Apple -> System.out.println("使用Lambda表达式"+Apple.toString()));
//按照大小升序排序
greenApples.sort((Apple a1,Apple a2) -> a1.getMax().compareTo(a2.getMax()));
这段代码看起来是不是清晰多了,这就是JDK8中的Lambda表达式的写法。
三、总结
通过上面的案例我们已经熟悉了JDK8中的Lambda表达式的写法,我们可以将filter方法进行提取让它变成一个公共的代码块,而不仅仅是过滤Apple了。
public interface Predicate<T> { boolean test(T t); }
public static <T> List<T> filter(List<T> inventory,Predicate<T> p) { List<T> result=new ArrayList<>(); for (T t : inventory) { if(p.test(t)){ result.add(t); } } return result; }
相关文章推荐
- Java_通过行为参数化传递代码
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- java8实战一:通过行为参数化传递代码
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- 《Java in Action》-1 第2章 通过行为参数化传递代码
- ruby on rails 通过链接跳转传递参数
- jquery通过url传递 和 接收 参数
- 一个通过script自定义属性传递配置参数的方法
- 二十二:通过引用向方法传递参数(使用out和ref参数)
- PHP通过引用传递参数用法分析
- 关于向后台请求数据(get请求,无参数传递),返回html代码(实际需要返回的是json数据)的解决方案
- mfc通过消息传递参数进行程序间通信
- JSP通过URL传递中文参数乱码的问题
- 通过内存模型深入理解参数传递方式
- FusionCharts通过属性link向JavaScript函数传递中文参数导致乱码的解决方法
- jquery通过ajax-json访问java后台传递参数,通过request.getParameter获取不到参数的说明
- javascript function传递 参数当参数是 字符串 如何拼接(有些参数是通过变量得到的) 如何拼接
- 通过地址栏传递参数.通过url传递参数
- 【代码】结构体做函数参数,实现形参向实参传递值
- VB.NET通过deletgrate传递线程的参数