Java 函数式接口的优点是什么?
What are the advantages of Java Functional Interfaces?
我正在研究这个函数式接口主题,我研究了如何使用预定义的函数式接口:Predicate 和 Function。
所以我创建了几个实现:
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);
我不明白使用这种测试条件或调用函数的形式有什么好处? (我确定有这样的!)
这与简单地调用常规函数来完成这些任务有何不同?
是为了让 lambda 表达式使用它们吗?是否允许将它们作为方法参数传递?
我很遗憾地错过了这种技术的真正原因。
你能解释一下吗?
谢谢!
如果您阅读有关功能接口和 lambda 的手册,您的问题可能会得到解答。
只需看一下 lambda 表达式和通常的匿名 class 创建之间的区别。这两个变量可以以相同的方式使用。
//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"));
我正在研究这个函数式接口主题,我研究了如何使用预定义的函数式接口:Predicate 和 Function。
所以我创建了几个实现:
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);
我不明白使用这种测试条件或调用函数的形式有什么好处? (我确定有这样的!)
这与简单地调用常规函数来完成这些任务有何不同?
是为了让 lambda 表达式使用它们吗?是否允许将它们作为方法参数传递?
我很遗憾地错过了这种技术的真正原因。
你能解释一下吗?
谢谢!
如果您阅读有关功能接口和 lambda 的手册,您的问题可能会得到解答。 只需看一下 lambda 表达式和通常的匿名 class 创建之间的区别。这两个变量可以以相同的方式使用。
//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"));