《Java 8 实战》(二)—— Lamda

Lamda表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表/函数主体/返回类型,可能还有一个可以抛出的异常列表。

Lamda表达式由参数/箭头和主体组成:

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

之前的代码形式:

Comparator<Apple> byWeight = new Comparator<Apple>() {
  public int compare(Apple a1, Apple a2) {

    return a1.getWeight().compareTo(a2.getWeight());

  }

}

Java 8 中有效的Lamda表达式:

1,  (String s) -> s.length()

  具有一个String类型的参数,并返回一个int。Lamda表达式没有return语句,因为已经隐含了return。

2,  (Apple a) -> a.getWeight() > 150

  参数为Apple类型,返回一个boolean类型。

3,  (int x, int y) -> {

    System.out.println("Result");

    System.out.println(x+y);

  }

  该Lamda表达式具有两个int类型的参数而没有返回值。Lamda表达式可以包含多行语句。

  () -> {return "Mario";}

  该Lamda表达式也是有效的。

4, () - > 42

  该Lamda表达式没有参数,返回一个int

5, (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())

  该表达式具有两个Apple类型的参数,返回一个int

无效Lamda表达式:

(Integer i) -> return "Alan" + i;

(String s) -> {"IronMan";}

第一个表达式中,return是一个控制流语句。要使得这个语句有效,需要加上花括号。

第二个表达式中,"IronMan" 是一个表达式,不是语句。要使得此Lamda有效,可以去除花括号和分号。

Lamda基本语法:

(parameters) -> expression

or

(parameters) -> { statements;}

可以使用Lamda表达式的地方 —— 函数式接口

  函数式接口就是只定义一个抽象方法的接口。如Comparator和Runnable接口。

  Lamda表达式可以直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。

  函数式接口的抽象方法的签名就是Lamda表达式的签名。这种抽象方法叫做函数描述符。

  新的Java API中,函数式接口带有@FunctionalInterface的标注。如果用@FunctionalInterface定义了一个接口,但它却不是函数式接口的话,便一起将返回一个提示原因的错误,例如“Multiple non-overriding abstract methods found in interface Foo”,表明存在多个抽象方法。

使用Lamda表达式的步骤:

1,行为参数化:

  提取Lamda表达式,设计好参数,函数主体和返回值。

2,使用函数式接口来传递行为:

  创建一个能匹配Lamda表达式的函数式接口I,并把这个接口作为参数传递给需要使用Lamda表达式的函数M。

3,执行函数式接口中的行为

  在函数M中调用接口I中的抽象函数

4,传递Lamda表达式

常用函数式接口:

Java 8 以前已有的函数式接口:

  Comparable

  Runnable

  Callable

Java 8 在java.util.function包中引入的新的函数式接口:

  Predicate  

@FunctionalInterface
public interface Predicate<T>{
    boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
    List<T> results = new ArrayList<>();
    for(T s: list){
        if(p.test(s)){
            results.add(s);
        }
    }
    return results;
}
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);

  Consumer  

  

@FunctionalInterface
public interface Consumer<T>{
    void accept(T t);
}
public static <T> void forEach(List<T> list, Consumer<T> c){
    for(T i: list){
        c.accept(i);
    }
}
forEach(Arrays.asList(1,2,3,4,5),(Integer i) -> System.out.println(i));

  Function

@FunctionalInterface
public interface Function<T, R>{
    R apply(T t);
}
public static <T, R> List<R> map(List<T> list,Function<T, R> f) {
    List<R> result = new ArrayList<>();
    for(T s: list){
        result.add(f.apply(s));
    }
    return result;
}

List<Integer> l = map(Arrays.asList("lambdas","in","action"),(String s) -> s.length());

Lamda及函数式接口例子

使用案例  Lambda的例子  对应的函数式接口
布尔表达式  (List<String> list) -> list.isEmpty()   Predicate<List<String>>
创建对象  () -> new Apple(10) Supplier<Apple>
消费一个对象 (Apple a) -> System.out.println(a.getWeight())

 
     
     
     

       Lambda的例子                   对应的函数式接口

                     
 
消费一个对象 (Apple a) ->
System.out.println(a.getWeight())
Consumer<Apple>
从一个对象中
选择/提取
(String s) -> s.length() Function<String, Integer>或
ToIntFunction<String>
合并两个值 (int a, int b) -> a * b IntBinaryOperator
比较两个对象 (Apple a1, Apple a2) ->
a1.getWeight().compareTo(a2.getWeight())
Comparator<Apple>或
BiFunction<Apple, Apple, Integer>
或ToIntBiFunction<Apple, Apple>

时间: 2024-12-26 07:30:04

《Java 8 实战》(二)—— Lamda的相关文章

【java项目实战】Servlet详解以及Servlet编写登陆页面(二)

Servlet是Sun公司提供的一门用于开发动态web网页的技术.Sun公司在API中提供了一个servlet接口,我们如果想使用java程序开发一个动态的web网页,只需要实现servelet接口,并把类部署到web服务器上就可以运行了. 到底什么是Servlet呢? 通俗一点,只要是实现了servlet接口的java程序,均称Servlet.Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据开发03

大家好,这次是第三个课时的视频,欢迎大家继续学习. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地址:http://www

JAVA实战教程_JAVA案例开发之JAVA开发微信二维码大数据系统02

hello,上一次我们上传了第一个课时的视频,现在当然是上传第二个视频咯. 视频简介:本视频是关于JAVA实战教程,JAVA开发微信二维码大数据系统.这个JAVA开发案例可以协助一些从零基础开始学习JAVA,正处于理论走完实践的路程上的初学者能接触到实际开发项目过程中,在实践当中巩固自己的JAVA方面的知识外,更能在项目案例当中学到解决在JAVA学习或者实践当中遇上问题的一些解决方式.仅供参考!自设交流群:457036818,欢迎一起加入交流. PS:该案例共十个课时,本小节为第二课时 课程原地

Java爬虫实战(二):抓取一个视频网站上2015年所有电影的下载链接

前言:这是Java爬虫实战的第二篇文章,在第一篇文章仅仅只是抓取目标网站的链接的基础上,进一步提高难度,抓取目标页面上我们所需要的内容并保存在数据库中.这里的测试案例选用了一个我常用的电影下载网站(http://www.80s.la/).本来是想抓取网站上的所有电影的下载链接,后来感觉需要的时间太长,因此改成了抓取2015年电影的下载链接. 注:文末有我抓取到的整个列表的下载链接(包括:电影名称和迅雷下载链接) 一 原理简介 其实原理都跟第一篇文章差不多,不同的是鉴于这个网站的分类列表实在太多,

实战Java虚拟机之二“虚拟机的工作模式”

今天开始实战Java虚拟机之二:"虚拟机的工作模式". 总计有5个系列 实战Java虚拟机之一"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" 目前的Java虚拟机支持Client和Server两种运行模式.使用参数-client可以指定使

Java NIO实战之聊天室

在工作之余花了两个星期看完了<Java NIO>,总体来说这本书把NIO写的很详细,没有过多的废话,讲的都是重点,只是翻译的中文版看的确实吃力,英文水平太低也没办法,总算也坚持看完了.<Java NIO>这本书的重点在于第四章讲解的"选择器",要理解透还是要反复琢磨推敲:愚钝的我花了大概3天的时间才将NIO的选择器机制理解透并能较熟练的运用,于是便写了这个聊天室程序. 下面直接上代码,jdk1.5以上经过测试,可以支持多人同时在线聊天: 将以下代码复制到项目中便

【Java】实战Java虚拟机之五“开启JIT编译”

今天开始实战Java虚拟机之五"开启JIT编译" 总计有5个系列 实战Java虚拟机之一"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" Java虚拟机有3种执行方式,分别是解释执行.混合模式和编译执行,默认情况下处于混合模式中.使用命令行

Java编程实战宝典PDF (中文版带书签)

Java编程实战宝典PDF 目录 第1篇 Java基础知识入门第1章 Java的开发运行环境( 教学视频:57分钟)1.1 Java运行原理与Java虚拟机1.1.1 Java运行原理简述1.1.2 Java虚拟机1.2 Java的开发环境1.2.1 JDK的安装1.2.2 如何设置系统环境变量1.2.3 JDK安装后的测试与验证1.2.4 编译命令的使用1.2.5 解释执行命令的使用1.2.6 UltraEdit的使用1.3 Java应用程序示例1.4 Java Applet程序示例1.5 本

Docker最全教程之Python爬网实战(二十一)

原文:Docker最全教程之Python爬网实战(二十一) Python目前是流行度增长最快的主流编程语言,也是第二大最受开发者喜爱的语言(参考Stack Overflow 2019开发者调查报告发布).笔者建议.NET.Java开发人员可以将Python发展为第二语言,一方面Python在某些领域确实非常犀利(爬虫.算法.人工智能等等),另一方面,相信我,Python上手完全没有门槛,你甚至无需购买任何书籍! 由于近期在筹备4.21的长沙开发者大会,耽误了不少时间.不过这次邀请到了腾讯资深技术

Java设计模式(二)-单例模式

单例模式建议保证某个对象仅仅只有一个实例,当只有一个对象来协调整个系统的操作时,在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例,总之,选择单例模式就是为了避免不一致状态,避免政出多头. 下面是单例模式的类图:包括的private和static修饰的实例instance.一个private的构造函数.一个static的getInstance函数 单例模式主要有三种:懒汉式单例.饿汉式单例.登记式单例三种 1.饿汉式单例:在类的初始化时候,自行创建了实例 c