“String::contains”是错误的。但如何表达 lambda 呢?
此外,当我在 IntelliJ IDEA 中编写此内容时:
obj.testPredicate(list, String::contains);
我在“String::contains”中收到错误:无法从静态上下文引用非静态方法。但 contains 不是静态方法。我对这些提示感到困惑。
我的代码如下:
public <T> List<T> testPredicate(List<T> list , Predicate<T> predicate){
List<T> result = new ArrayList<>();
for(T t: list){
if(predicate.test(t)){
result.add(t);
}
}
return result;
}
这是调用者:
@Test
public void testPredicate() throws Exception {
List<String> listTemp = lambda.testPredicate(list, s -> s.contains("o"));
System.out.println(listTemp);
}
为什么最简单的 lambda 不能被方法引用替换?
我看到 Using method reference instead of multi argument lambda .
它说
(2) If func is an instance method, then SomeClass::func is a lambda that uses the first argument as the instance, as you thought: (a, b, c) -> a.func(b, c);
与 my (String a, String b)-> a.contains(b); 没有区别为什么方法引用不起作用?
最佳答案
您可以创建自己的谓词:
public class StringPredicates {
public static Predicate<String> contains(String contained) {
return s -> s.contains(contained);
}
}
然后你可以像这样使用它们:
obj.testPredicate(list, StringPredicates.contains("o"));
请注意,您不需要方法引用来使用此类构造。正如我常说的:需要时使用正确的工具!在这种情况下,您有一个变量,因此不建议使用方法引用。
如果你确实必须使用方法引用,你可以这样写:
public static boolean containsO(String s) {
return s.contains("o");
}
然后使用它:
obj.testPredicate(list, StringPredicates::containsO);
关于java - 如何使用java 8方法引用表达 "(String a)-> a.contains("o")",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45398021/