Java SE8:Lambda快速入门

2023-10-08 11:18
文章标签 java 入门 快速 lambda se8

本文主要是介绍Java SE8:Lambda快速入门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html

本篇为译文。

一、概览

目标

     该教程介绍Java8平台中新的lambda表达式。

耗时

     大约1小时

介绍

     Lambda表达式是Java se8中一个新增的,并且是它重要特征。它们使用一个表达式,提供了一种清晰和简洁的方式来表示仅有一个方法的接口。Lambda表达式同时还改进了集合类库,使它更加容易使用,从一个集合中进行遍历、过滤、提取数据。另外,在处理器环境中,新的并发特性提高了系统性能。
     Oracle的这个例子,提对Java se8中lambda表达式进行介绍。包含了匿名内部方法(anonymous inner functions)介绍,还包含了函数接口和新lambda语法介绍。最后,lambda表达式通用使用模式的例子将提供给大家。
     下一部分回顾了一个通用查询使用例子和使用lambda表达式包含的部分来改进Java代码。另外,一些通用的函数接口,java.util.function包中提供的Predicate和Function接口,也在例子中展现。
     在OBE的最后一部分中,回顾已经使用lambda表达式更新过的Java集合。
     所有例子中的源代码都将会提供给你。

硬件和软件要求

     下面列出所需硬件和软件:

  • JDK8
  • NetBeans 7.4
前提条件

     为了运行这些例子,你必须有能够使用的jdk8和NetBeans7.4或者更高版本的。可以在the main Lambda site链接里查找。为了让你更加方便使用,下面是直接的链接。

  • jdk 8获取 jdk8
  • NetBeans 7.4或者更高版 netbeans

二、背景

1.匿名内部类

     在Java中,匿名内部类提供了一种方式来实现那些在应用中进一次使用的类。例如,在标准的Swing或者JavaFX应用,需要包含键盘和鼠标的许多处理事件。代替分别给每个事件写处理类,你可以使用如下情况:

JButton testButton = new JButton("test Button");
testBUtton.addActionListerner(new ActionListener(){
@Override public void actionPerformed(ActionEvent ae){System.out.println("Click Detected by Anon Class");
}
});

     否则,对于每个事件,都需要有独立的实现了接口ActionListerner的类。通过在需要的地方创建类,这种代码使得更加容易读一些。但是这代码并不够简洁,因为仅仅定义一个方法需要许多代码。

2.函数接口

     接口ActionListerner的定义如下:

package java.awt.event;
import java.util.EventListerner;
public interface ActionListener extends EventListener{public void actionPerformed(ActionEvent e);
}

ActionListener是一个只有一个方法的接口,Java se8中,满足一下条件的接口被称为函数接口。

     备注: 这种类型的接口,只有一个抽象方法(SIngle Abstract Method type)。

在Java中,匿名内部类使用函数接口比较多的一种模式。除了EventListener 类,像Runnable和Comparator接口都使用类似的方式。因此,函数接口在使用lambda表达式中比较通用。

3.Lambda表达式语法

     Lambda表达式通过将5行代码转成一个单独的语句来处理匿名内部类的笨重问题。这个简单水平答案解决了内部类呈现出来的垂直问题。
     一个Lambda表达式由三部分组成。

参数列表箭头标识主体
(int x,int y)->x+y

主体可以是一个单独的表达式或者块。上面的例子中,主体是简单的求值并返回。在块中,主体类似一个方法体,需要return语句返回来控制匿名方法的调用。关键字break和continue在顶级中是不合法的,但是循环中是被允许使用的。如果主体产生了一个结果,每一个控制路径必须返回或者抛出异常。
看看如下例子:

(int x, int y) -> x + y;
() -> 42;
(String s) -> { System.out.println(s);}

第一个表达式传递了两个整形参数,名字为x和y,并使用x+y方式来返回结果值。第二个表达式没有参数并使用表达式返回一个整形值42。第三个表达式产地一个字符串,并使用块形式来将该参数打印到控制台,同时不返回结果。
通过上面的语法,现在我们来看一些例子。

三、Lambda例子

1.Runnable Lambda

     以下使用Lambda表达式来写Runnable。

public class RunnableTest{public static void main(String[] args){System.out.println("===Runnable Test ====");//Anonymous RunnableRunnable r1 = new Runnable(){@Overridepublic void run(){System.out.println("Hello world one!");}};//Lambda RunnableRunnable r2 = () -> System.out.println("Hello world two!");r1.run();r2.run();}}

在两个例子中,注意没有传递参数和返回值。
Runnable lambda表达式,使用块,将5行代码转成一行。

2.Comparator Lambda

在Java中,Comparator类被用于集合排序。在下面的例子中,ArrayList包含Person对象,基于surName排序。

public class Person{private string givenName;private String surName;private int age;private Gender gender;private string eMail;private String phone;private String address;
}

以下例子使用匿名内部类和一些lambda表达式

public class ComparatorTest{publibc static void main(String[] args){List<Person> personList = Person.createShortList();//sort with inner classCollections.sort(personList,new Comparator<Person>(){public int compare(Person p1,Person p2){return p1.getSurName().compareTo(p2.getSurName);}});System.out.println("===sorted asc surName==");for(Person p:personList){p.printName();}//use Lambda insteadSystem.out.println("==sorted asc surName===");Collections.sort(personList,(Person p1,Person p2)->getSurName().compare(p2.getSurName()));for(Person p:personList){p.printName();}//print desc}
}
3.Listener Lambda
4.资源

四、使用Lambda表达式改进代码

五、java.util.function包

六、Lambda表达式和集合

七、总结

这篇关于Java SE8:Lambda快速入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164894

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja