集合和方法引用的Lambda用法

public class FruitList {

private List fruits = null;

public FruitList() {
fruits = new ArrayList();
}

public List getFruits() {
return fruits;
}

public void setFruits(List fruits) {
this.fruits = fruits;
}

public void addToBasket(String fruit) {
fruits.add(fruit);
}

public boolean fruitExists(Predicate fruitExists) {
if(fruitExists==null) {
new NullPointerException(“null predicate”);
}
Stream listStream = fruits.stream();
boolean exists = listStream.anyMatch(fruitExists);
return exists;
}

public boolean sameFruits(Predicate sameFruits) {
if(sameFruits==null) {
new NullPointerException(“null predicate”);
}
Stream listStream = fruits.stream();
boolean allSame = listStream.allMatch(sameFruits);
return allSame;
}
}

现在我们来看看如何向集合添加元素并使用lambda表达式来验证集合是否包含特定值或整个集合是否包含相同的值。 在清单1中,方法fruitExists(Predicate fruitExists)和方法sameFruits(Predicate sameFruits)获取对集合的流引用。

下面的代码(清单2)演示了对集合执行所需操作的客户端代码

package cn.enjoyedu.samples.lambda.collections;

import java.util.function.Predicate;

public class CollectionElementCheckDemo {

public void evaluate() {
Predicate apples = § -> {
return p.equalsIgnoreCase(“apple”);
};

FruitList fruits = new FruitList();
fruits.addToBasket(“apple”);
fruits.addToBasket(“peach”);
fruits.addToBasket(“orange”);
fruits.addToBasket(“orange”);
fruits.addToBasket(“pineapple”);
fruits.addToBasket(“banana”);
boolean appleAvailable = fruits.fruitExists(apples);
boolean allApples = fruits.sameFruits(apples);
System.out.println("Apple in list? : "+ appleAvailable);
System.out.println(“All same fruits? : “+ allApples);
System.out.print(”\n”);
// clearing previous list entries
fruits.getFruits().clear();
// adding new entries to list
fruits.addToBasket(“avocado”);
fruits.addToBasket(“avocado”);
fruits.addToBasket(“avocado”);
fruits.addToBasket(“avocado”);
boolean avocadoAvailable = fruits.fruitExists(a -> a.equalsIgnoreCase(“avocado”));
boolean allAvocados = fruits.sameFruits(a -> a.equalsIgnoreCase(“avocado”));
System.out.println("Avocados in list? : "+ avocadoAvailable);
System.out.println("All same fruits? : "+ allAvocados);
}

public static void main(String… args) {
CollectionElementCheckDemo demo = new CollectionElementCheckDemo();
demo.evaluate();
}
}

清单2中的代码将数据添加到集合,定义谓词,并将谓词传递给接受lambda表达式的方法。 下面显示的输出是通过执行清单2中的CollectionElementCheckDemo获得的。要评估和满足的条件由客户端代码传递,而通过列表的每个元素并评估元素由相应的列表实现处理。

Apple in list? : true
All same fruits? : false
Avocados in list? : true
All same fruits? : true

下面的代码(清单3)中的客户端代码演示了使用lambda表达式从集合中删除元素的代码实现。 删除后,使用Stream API的forEach方法打印集合数据。 为了打印集合的每个元素,我们使用java.util.function.Consumer功能接口。 使用Consumer API定义的lambda表达式逐个获取对每个元素的集合数据的引用,因此我们可以对集合数据执行所需的操作。 Predicate API有助于评估条件表达式并返回布尔结果。

package cn.enjoyedu.samples.lambda.collections;

import java.util.function.Predicate;

public class CollectionElementRemovalDemo {

public void evaluate() {
Predicate exists = § -> {
return p.equalsIgnoreCase(“apple”);
};

FruitList fruits = new FruitList();
fruits.addToBasket(“apple”);
fruits.addToBasket(“peach”);
fruits.addToBasket(“orange”);
fruits.addToBasket(“orange”);
fruits.addToBasket(“pineapple”);
fruits.addToBasket(“banana”);
boolean remove = fruits.getFruits().removeIf(exists);
System.out.println(“Apple removed from list? : “+ remove);
System.out.print(”\n”);
fruits.getFruits().forEach(c -> System.out.println©);
}

public static void main(String… args) {
CollectionElementRemovalDemo demo = new CollectionElementRemovalDemo();
demo.evaluate();
}
}

输出结果将是:

Apple removed from list? : true

peach
orange
orange
pineapple
banana

下面的代码(清单4)中的代码演示了java.util.functional.Consumer接口的另一种用法,即lambda表达式。 定义的表达式会评估每个元素以检查特定的国家/地区类型,然后使用适当的国家/地区特定问候语。 此实现显示Consumer API可用于复杂操作,而不仅仅是将元素打印到输出控制台。

package cn.enjoyedu.samples.collections;

import java.util.ArrayList;
import java.util.function.Consumer;

public class CollectionElementProcessDemo {

public void evaluate() {
Consumer listEntries = (l) -> {
System.out.println("processing : "+ l);
switch (l) {
case “USA”:
System.out.println("Hello " + l);
break;
case “Spain”:
System.out.println("Hola " + l);
break;
case “France”:
System.out.println("Bonjour " + l);
break;
case “India”:
System.out.println(“Namaste " + l);
break;
case “China”:
System.out.println(“你好 " + l);
break;
}
System.out.print(”\n”);
};

ArrayList countryList = new ArrayList();
countryList.add(“India”);
countryList.add(“USA”);
countryList.add(“Thailand”);
countryList.add(“France”);
countryList.add(“Spain”);
countryList.add(“China”);
countryList.add(“abc”);
System.out.print(“\n”); // evaluates each element of collection
countryList.stream().forEach(listEntries);
}

public static void main(String… args) {
CollectionElementProcessDemo demo = new CollectionElementProcessDemo();
demo.evaluate();
}
}

输出结果将是:

processing : India
Namaste India

processing : USA
Hello USA

processing : Thailand

processing : France
Bonjour France

processing : Spain
Hola Spain

processing : China
你好 China

processing : abc

使用Lambda表达式和方法引用

我们已经知道,lambda表达式是表达匿名方法实现的一种方式。方法引用是Java 8中引入的一个新特性,它们补充了lambda表达式。方法引用定义了用于调用已定义方法的语法。调用方法是构建lambda表达式(调用匿名方法)和方法引用(调用命名方法)的共同基础,使方法引用替代接受lambda表达式的方法,例如,接受实例的方法功能界面。

清单5中的代码演示了使用方法引用作为lambda表达式的替代方法,并强调了可以调用接受函数接口作为参数的方法的不同方法。

package cn.enjoyedu.samples.lambda.methodref;

最后

在这里小编整理了一份Android大厂常见面试题,和一些Android架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。

image

image

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
有所帮助,在面试中能顺利通过。

[外链图片转存中…(img-x8Mrjt09-1715425303382)]

[外链图片转存中…(img-DxxLjdGS-1715425303383)]

喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值