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架构视频解析,都已整理成文档,全部都已打包好了,希望能够对大家有所帮助,在面试中能顺利通过。
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
有所帮助,在面试中能顺利通过。
[外链图片转存中…(img-x8Mrjt09-1715425303382)]
[外链图片转存中…(img-DxxLjdGS-1715425303383)]
喜欢本文的话,不妨顺手给我点个小赞、评论区留言或者转发支持一下呗
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!