JAVA8 in Action:行为参数化,匿名类及lambda表达式的初步认知实例整理
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表达式的初步认知实例整理的更多相关文章
- Java 匿名类和lambda表达式
一.匿名内部类 一个匿名内部类是一个没有名字的内部类.它将进一步定义一个内部类以及创建一个内部类的实例. 内部类处理器可以使用匿名内部类进行代码简化. 匿名内部类的语法如下所示: new SuperC ...
- java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
2017/6/30 转载写明出处:http://www.cnblogs.com/daren-lin/p/anonymous-classes-and-lambda-expressions-in-java ...
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- C# 从CIL代码了解委托,匿名方法,Lambda 表达式和闭包本质
前言 C# 3.0 引入了 Lambda 表达式,程序员们很快就开始习惯并爱上这种简洁并极具表达力的函数式编程特性. 本着知其然,还要知其所以然的学习态度,笔者不禁想到了几个问题. (1)匿名函数(匿 ...
- C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...
- 写的非常好的文章 C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- (转)C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- [No0000134]C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
- 【转】C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=5.答案是6个Fir ...
随机推荐
- JS 单线程和事件循环
Js 是单线程,js代码从上到下依次执行,比如我们写了两个函数,肯定是上面的函数先执行,下面的函数后执行.但是这种单线程有一个非常大的问题,那就是遇到耗时的任务,后面的任务只能等待它执行完,才能进行. ...
- AMD三代锐龙箭在弦上:如此家族堪称豪华
AMD将于今年年中正式推出第三代Ryzen锐龙处理器,即不集成显示芯片的纯CPU产品,外界猜测可能的时间点会是5月底的台北电脑展. 虽说依然采用AM4接口,也就是X370/470老主板可无压力兼容,但 ...
- Jquery根据滚动条显示返回按钮
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- HTML5-Audio-基础篇
播放音频文件 //control属性添加播放.暂停和音量控件<audio controls> <source src="horse.ogg" type=" ...
- ajax 的json格式
我们平时使用ajax向后台传递数据时,通常会传递json格式的数据,当然这里还有其它格式,比如xml.html.script.text.jsonp格式. json类型的数据包含json对象和json类 ...
- python之旅六【第六篇】模块
json和pickle 用于序列化的两个模块json,用于字符串 和 python数据类型间进行转换pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...
- 自定义Wed框架
Wed框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义wed框架 impor ...
- 【XSY2715】回文串 树链剖分 回文自动机
题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...
- 安装 xadmin 报错: Command "python setup.py egg_info" failed with error code 1 in C:\Users\Python\AppData\Local\Temp\pip-install-1k1byg0p\xadmin\
报错详情 安装 xadmin 组件的时候报错 不论是命令行还是 pycharm 方式都不行 分析报错 按照报错提示是说 README.rst 文件的编码问题导致. 解决报错 通过 github 下载源 ...
- bit、Byte、bps、Bps、pps、Gbps的单位详细说明及换算
1. bit 电脑记忆体中最小的单位,在二进位电脑系统中,每1bit 可以代表0 或 1 的数位讯号. 2. Byte 字节单位,一般表示存储介质大小的单位,一个B(常用大写的B来表示Byte)可代表 ...