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 ...
随机推荐
- 基于jQuery-ui实现多滑块slider
效果图: 代码: <!doctype html> <html lang="en"> <head> <meta charset=" ...
- BZOJ3724PA2014Final Krolestwo——欧拉回路+构造
题目描述 你有一个无向连通图,边的总数为偶数.设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每条边长度为1)的 ...
- Educational Codeforces Round 60 Div. 2
F:考虑对于每个字母对求出删掉哪些字符集会造成字符串不合法,只要考虑相邻出现的该字母对即可,显然这可以在O(np2)(或小常数O(np3))内求出.然后再对每个字符集判断是否能通过一步删除转移而来即可 ...
- POJ 1125-Stockbroker Grapevine-最短路
裸最短路 /*--------------------------------------------------------------------------------------*/ // H ...
- 「POJ3311」Hie with the Pie
题目链接 >http://poj.org/problem?id=3311< 题意:从0出发,经过所有点(点可以重复走)后回到0点,问最短路 思路分析: 这题和普通的最短路不太一样,因为题目 ...
- wstngfw IPsec 站点到站点连接示例
wstngfw IPsec 站点到站点连接示例 在本例中,将假设以下设置: IPsec站点设置 站点 A 站点 B 名称 Beijing Office(北京办公室) 名称 Shenzheng Offi ...
- THUSC2017题解
THUSC2017题解 题目都是在LOJ上交的. chocolate LOJ#2977巧克力 这题看着就让人想起了百度之星复赛的\(T5\),就是这题. 因为种类的个数很多,所以把每个种类随意\(ra ...
- [2017-7-25]Android Learning Day3
最近真的有点迷茫,感觉没有一个完整的教学体系很难进行下去,有的都是自己瞎捉摸,就跟以前ACM的时候一样,动不动就“这就是一道,水题暴力就行了”.“我们枚举一下所有的状态,找一下规律就行了”,mmp哟. ...
- 关于overflow-x: hidden隐藏滚动条失效的解决方案
在苦逼写页面的时候,发现有种情况overflow-x: hidden失效了,chrome表现完好,qq浏览器有问题,微信上面展示有问题. 微信上面展示是一样能够滑动的. 如果出现类似问题的同学,请试一 ...
- oath2
最近在补架构师图谱里的内容,OAuth2.0是其中一块,抽空看了几个文章,理解了一下. 不过我感觉多数文章都不是很直观,花费了好久才理解其中的过程,以及为什么要这么设计,也许里面还有一些为什么没搞清楚 ...