java - Java 函数式接口的优点是什么?
问题描述
我正在研究这个功能接口主题,并且我研究如何使用预定义的功能接口:谓词和函数。
所以我创建了几个实现:
public static Predicate<String> isStringEmpty = String::isEmpty;
public static Predicate<String> isStringNotEmpty = isStringEmpty.negate();
public static Predicate<ArrayList> arrayListIsEmpty = ArrayList::isEmpty;
public static Predicate<ArrayList> arrayListIsNotEmpty = arrayListIsEmpty.negate();
public static Predicate<String> stringStartsWithA = s -> s.startsWith("A");
public static Predicate<Integer> largerThanNine = n -> n > 9;
public static Function<WebElement, String> getWebElementText = WebElement::getText;
//etc.
我继续在我的代码中使用它们。例如:
isStringEmpty.negate().test("asd");
isStringNotEmpty.test("asd");
stringStartsWithA.negate().test("asd");
isStringNotEmpty.and(isStringEmpty).negate().test("aaa");
csvLine = getWebElementText.apply(leaugeRowElement);
我无法理解使用这种测试条件或调用函数的形式有什么好处?(我相信有这样的!)
这与简单地调用常规函数来完成这些任务有什么不同?
是否允许 lambdas 使用它们?是否允许将它们作为方法参数传递?
我很明显地错过了这种技术的真正原因。
你能解释一下吗?
谢谢!
解决方案
如果您阅读有关功能接口和 lambdas 的手册,您的问题可能会得到解答。看看 lambda 表达式和通常的匿名类创建之间的区别。这两个变量可以以相同的方式使用。
//using anonymous class
Predicate<String> isStringEmptyObj = new Predicate<String>() {
@Override
public boolean test(String o) {
return o.isEmpty();
}
};
System.out.println(isStringEmptyObj.negate().test("asd"));
//using lambda with reference to existing String object method
Predicate<String> isStringEmpty = String::isEmpty;
System.out.println(isStringEmpty.negate().test("asd"));
推荐阅读
- mongodb - MERN堆栈二进制图像只是一个黑色方块
- python - 尽管代码正常运行,但将约会上传到 Outlook 日历时出现 Python 属性错误
- javascript - React Native 动态构建树
- android - 在 SVG 中反应原生编辑路径
- python - 使用 Python 和 Microsoft Graph 从电子邮件中提取数据
- c++ - while循环和getline问题
- php - preg_match_all 多次出现
- azure-devops - 通过 Terraform Helm 提供程序和 Azure DevOps 部署 helm 图表,同时从 ACR 获取 helm 图表
- javascript - 使用formData以角度8发送json格式的数据
- authentication - 如何在 Xamarin 应用程序中使用管理员 REST API 在 couchbase 同步网关中创建新用户?