栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8--Lambda表达式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8--Lambda表达式

文章目录
    • Lambda管中窥豹(初识Lambda)
    • 在哪里以及如何使用Lambda
    • 应用举例
    • Java8中常用的函数式接口

Lambda管中窥豹(初识Lambda)

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


在哪里以及如何使用Lambda
在函数式接口上使用Lambda表达式。
函数式接口就是只定义一个抽象方法的接口。

函数式接口举例:

public interface Comparator { 
 int compare(T o1, T o2); 
} 
public interface Runnable{
 void run(); 
} 
public interface Predicate{
 boolean test (T t); 
} 

Lambda应用举例:

List greenApples = filter(inventory, (Apple a) -> "green".equals(a.getColor()));

在上面的代码中,把 Lambda 表达式作为第二个参数传给 filter 方法,因为它这里需要
Predicate,而这是一个函数式接口。

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。
凡是使用函数式接口的地方都可以使用Lambda表达式

例如:
() -> void,代表参数列表为空,返回void的函数。这正是Runnable所代表的。
(Apple, Apple) -> int,代表接收两个Apple作为参数且返回int的函数。

应用举例

通过一个例子,看看在实践中如何利用Lambda和行为参数化来让代码更为灵活,更为简洁。

原始方法如下:

缺点是只能读文件的第一行。如果你想要返回头两行,甚至是返回使用最频繁的词,怎么办?复制、粘贴,修改有用工作的那行代码?
第1步:行为参数化
你需要一种方法把行为传递给processFile
String result = processFile(“行为”);
第2步:使用函数式接口传递行为

// 定义函数式接口
@FunctionalInterface 
public interface BufferedReaderProcessor { 
 String process(BufferedReader b) throws IOException; 
} 
// 把这个接口作为新的processFile方法的参数
public static String processFile(BufferedReaderProcessor p) throws IOException { 
 … 
} 

第3步:执行行为

public static String processFile(BufferedReaderProcessor p) throws IOException { 
 try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { 
 return p.process(br);  // 执行行为
 } 
} 

第4步:传递Lambda

// 处理一行
String oneLine = processFile((BufferedReader br) -> br.readLine()); 
// 处理两行
String twoLines = processFile((BufferedReader br) -> br.readLine() + br.readLine()); 
Java8中常用的函数式接口

Java 8的库设计师帮你在java.util.function包中引入了几个新的函数式接口。
总结如下:

1. Predicate

java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。


2. Consumer

java.util.function.Consumer定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。

@FunctionalInterface 
public interface Consumer{ 
 void accept(T t); 
} 

public static  void forEach(List list, Consumer c){
	for(T i: list){ 
 		c.accept(i); 
 	} 
} 
// 调用举例
forEach(Arrays.asList(1,2,3,4,5), (Integer i) -> System.out.println(i)); 

3.Function

java.util.function.Function接口定义了一个叫作apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号