java - 如何使用java 8方法引用表达 "(String a)-> a.contains("o")"

标签 java lambda java-8 method-reference

“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/

相关文章:

Java 通用使用格式

Java 8 LocalDateTime 今天在特定时间

java - 如何在 Lambda 表达式中定义 Intent

java - 如何使用java流在每次迭代中使用当前和下一个对象对列表进行分区?

java - 将歌曲插入播放列表返回 null

java - Spring Boot Redis 配置不起作用

java - JAXB2 类型限制不起作用?

python - 使用 Lambdas 的 Panda Dataframes 条件语句

c# - 在 C# 中使用 ExpressionVisitor 识别 lambda 表达式中的括号

c# - Linq/Lambda OrderBy Delegate for List<string> of IP Addresses