当前位置: 首页 > news >正文

手机上怎么做微电影网站自助建站系统代理

手机上怎么做微电影网站,自助建站系统代理,网站背景怎么做,宝山网站建设公司Java8实战-总结11 Lambda表达式方法引用管中窥豹如何构建方法引用 构造函数引用 Lambda表达式 方法引用 方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感…

Java8实战-总结11

  • Lambda表达式
    • 方法引用
      • 管中窥豹
        • 如何构建方法引用
      • 构造函数引用

Lambda表达式

方法引用

方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感觉也更自然。下面就是借助更新的Java 8 API,用方法引用写的一个排序的例子:
先前:
3

inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));

之后(使用方法引用和java.util.Comparator.comparing):

inventory.sort (comparing(Apple::getWeight));

管中窥豹

为什么应该关心方法引用?方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它。事实上,方法引用就是让你根据已有的方法实现来创建Lambda表达式。但是,显式地指明方法的名称,代码的可读性会更好。它是如何工作的呢?当需要使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。例如,Apple::getWeight就是引用了Apple类中定义的方法getWeight请记住,不需要括号,因为没有实际调用这个方法。方法引用就是Lambda表达式(Apple a) -> a.getWeight()的快捷写法。下表给出了Java 8中方法引用的其他一些例子。
在这里插入图片描述

可以把方法引用看作针对仅仅涉及单一方法的Lambda的语法糖,因为你表达同样的事情时要写的代码更少了。

如何构建方法引用

方法引用主要有三类。

  • 指向静态方法的方法引用(例如IntegerparseInt方法,写作Integer::parseInt)。
  • 指向任意类型实例方法的方法引用(例如Stringlength方法,写作String::length)。
  • 指向现有对象的实例方法的方法引用(假设有一个局部变量expensiveTransaction用于存放Transaction类型的对象,它支持实例方法getValue,那么你就可以写expensiveTransaction::getValue)。

第二种和第三种方法引用可能乍看起来有点儿晕。类似于string::length的第二种方法引用的思想就是在引用一个对象的方法,而这个对象本身是Lambda的一个参数。例如,Lambda表达式(String s) -> .toUppeCase()可以写作String::toUpperCase。但第三种方法引用指的是,在Lambda中调用一个已经存在的外部对象中的方法。例如,Lambda表达式()->expensiveTransaction.getValue()可以写作expensiveTransaction::getValue。依照一些简单的方子,就可以将Lambda表达式重构为等价的方法引用,如下图所示:
在这里插入图片描述

请注意,还有针对构造函数、数组构造函数和父类调用(super-call)的一些特殊形式的方法引用。举一个方法引用的具体例子吧。比方说想要对一个字符串的List排序,忽略大小写。Listsort方法需要一个Comparator作为参数。在前面看到,Comparator描述了一个具有(T, T)->int签名的函数描述符。可以利用string类中的compareToIgnoreCase方法来定义一个Lambda表达式(注意compareToIgnoreCaseString类中预先定义的)。

List<String> str = Arrays.asList("a","b","A","B");
str.sort((s1, s2)-> s1.compareToIgnorecase(s2));

Lambda表达式的签名与Comparator的函数描述符兼容。利用前面所述的方法,这个例子可以用方法引用改写成下面的样子:

List<String> str = Arrays.asList("a","b","A","B");
str.sort(String::compareToIgnoreCase);

请注意,编译器会进行一种与Lambda表达式类似的类型检查过程,来确定对于给定的函数式接口,这个方法引用是否有效:方法引用的签名必须和上下文类型匹配。

测验:方法引用
下列Lambda表达式的等效方法引用是什么?
(1) Punction<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);(2)BiPredicatecList<String>, String> contains =(list, element) -> list.contains(element);答案如下。
(1)这个Lambda表达式将其参数传给了Integer的静态方法parseInt。这种方法接受一个需要解析的String,并返回一个Integer。因此,可以使用上图中的办法①(Lambda表达式调用静态方法)来重写Lambda表达式,如下所示:
Function<String, Integer>  stringToInteger = Integer::parseInt;
(2)这个Lambda使用其第一个参数,调用其contains方法。由于第一个参数是List类型的,可以使用上图中的办法②,如下所示:
BiPredicate<List<String>, String> contains = List::contains;
这是因为,目标类型描述的函数描述符是(List<String>, String) -> boolean,而List::contains可以被解包成这个函数描述符。

到目前为止,只展示了如何利用现有的方法实现和如何创建方法引用。但是也可以对类的构造函数做类似的事情。

构造函数引用

对于一个现有构造函数,可以利用它的名称和关键字new来创建它的一个引用:
ClassName::new。它的功能与指向静态方法的引用类似。例如,假设有一个构造函数没有参数。
它适合Supplier的签名() -> Apple。可以这样做:

//构造函数引用指向默认的Apple()构造函数
Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();

这就等价于:

//调用Supplier的get方法将产生一个新的Apple
//利用默认构造函数创建Apple的Lambda表达式
Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();

如果构造函数的签名是Apple(Integer weight),那么它就适合Function接口的签名,于是可以这样写:

//指向Apple(Integer weight)的构造函数引用
Function<Integer, Apple> c2 = Apple::new;
//调用该Function函数的apply方法,并给出要求的重量,将产生一个Apple
Apple a2 = c2.apply(110);

这就等价于:
用要求的重量创建一
个Apple的Lambda表

//用要求的重量创建一个Apple的Lambda表达式
FunctioncInteger,Apple> c2 =(weight)-> new Apple(weight);
//调用该Punction函数的apply方法,并给出要求的重量,将产生一个新的Apple对象
Apple a2 = c2.apply(110);

在下面的代码中,一个由Integer构成的List中的每个元素都通过前面定义的类似的map方法传递给了Apple的构造函数,得到了一个具有不同重量苹果的List:

//将构造函数引用传递给map方法List<Integer> weights = Arrays.asList(7,3,4,10);List<Apple> apples = map(weights, Apple::new);public static List<Apple> map(List<Integer> list, Function<Integer, Apple> f) {List<Apple> result = new ArrayList<>();for(Integer e: list) {result.add(f.apply(e));}return result;}

如果有一个具有两个参数的构造函数Apple(String color, Integer weight),那么它就适合BiFunction接口的签名,于是可以这样写:

//指向Apple(String color,Integer weight)的构造函数引用
BiPunction<String, Integer, Apple> c3 = Apple::new;
//调用该BiFunction函数的apply方法,并给出要求的颜色和重量,将产生一个新的Apple对象
Apple c3 = c3.apply("green", 110);

这就等价于:

//用要求的颜色和重量创建一个Apple的Lambda表达式
BiPunction<String, Integer, Apple> c3 = (color, weight) -> new Apple(color, weight);//调用该BiPunction函数的apply方法,并给出要求的颜色和重量,将产生一个新的Apple对象
Apple c3 = c3.apply("green", 110);

不将构造函数实例化却能够引用它,这个功能有一些有趣的应用。例如,可以使用Map来将构造函数映射到字符串值。创建一个giveMeFruit方法,给它一个String和一个Integer,它就可以创建出不同重量的各种水果:

static Map<String, Function<Integer, Fruit>> map = new HashMap<>();
static {map.put("apple", Apple::new);map.put("orange", Orange::new);// etc...
}//用map得到了一个Function<Integer, Fruit>
public static Fruit giveMeFruit(String fruit, Integer weight) {//用Integer类型的weight参数调用Function的apply()方法将提供所要求的Fruitreturn map.get(fruit.toLowercase()).apply(weight);
}
测验:构造函数引用
已经看到了如何将有零个、一个、两个参数的构造函数转变为构造函数引用。那要怎么样才能对具有三个参数的构造函数,比如Color(int,int,int),使用构造函数引用呢?答案:构造函数引用的语法是ClassName::new,那么在这个例子里面就是Color::new。但是需要与构造函数引用的签名匹配的函数式接口。
但是语言本身并没有提供这样的函数式接口,可以自己创建一个:
public interface TriFunction<T,U, V, R> {R apply(T t,U u,V v);
}
现在可以像下面这样使用构造函数引用了:
TriPunction<Integer, Integer, Integer, Color> colorFactory = Color::new;
http://www.ritt.cn/news/12268.html

相关文章:

  • 深圳企业网站制作维护找小网站的关键词
  • 上饶婚纱工作室网站建设怎么在网上做广告
  • 网站跳转qq链接怎么做的长尾关键词挖掘精灵官网
  • 潍坊尚呈网站建设公司网站优化课程培训
  • 英文网站建站模板班级优化大师怎么下载
  • 国外申请域名的网站北京搜索引擎优化主管
  • gis做图网站太原做推广营销
  • 做借贷网站平台网络营销事件
  • 如何给自己建设的网站设置登陆用户名和密码百度指数下载
  • 有人上相亲网站做传销燕窝新闻稿件代发平台
  • 中国房地产网站网站关键字优化公司
  • 西安网站建设开发查派东莞头条最新新闻
  • 分布式wordpresssemseo
  • 购物网站宣传方案成都网站优化seo
  • 聊城网站建设lchckj搜索引擎优化是什么?
  • 长沙网站排名哈尔滨百度公司地址
  • wordpress菜单对齐修改晨阳seo服务
  • 在跨境网站贸易公司做怎么样免费卖货平台
  • 金华网站建设深圳seo关键词优化
  • 官方微网站企业网站的推广形式有
  • 宁波建设网站公司投放广告怎么投放
  • 网站空间流量6g南宁百度快速优化
  • wordpress发布的文章无法显示内容福州百度快速优化
  • 深圳网站建设哪家口碑好哈尔滨最新消息
  • 好用的网站开发软件百度竞价代理公司
  • 哈尔滨建设职工大学文明seo技术教程网
  • 深圳汇网网站建设绍兴seo推广公司
  • 局域网做网站 内网穿透武汉刚刚发生的新闻
  • 上海做网站报价cba赛程
  • 动态网站使用数据库的意义seo 优化 工具