当前位置: 首页 > 知识库问答 >
问题:

如何表示"(字符串a)->a.contains("o")"使用java 8方法参考

翟迪
2023-03-14

“String::contains”是错误的。但是如何表达lambda呢?

此外,当我在IntelliJ IDEA中写这篇文章时:

obj。testPredicate(列表,字符串::contains);

我得到的错误在"字符串::c":非静态方法不能被引用从一个静态的上下文。我被这些提示弄糊涂了。

我的代码如下:

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不能被方法引用替换?

我看到了使用方法引用,而不是多参数lambda。

它说

(2) 如果func是一个实例方法,那么SomeClass::func是一个lambda,它使用第一个参数作为实例,正如您所想:(a,b,c)-

与my(字符串a、字符串b)没有差异-

共有3个答案

井翰
2023-03-14

字符串包含方法在本例中需要一个参数为“o”。

当我们指定谓词时,对字符串列表进行过滤时,通常的系统税是-

IntelliJ只在方法没有参数时给出建议。

例如当您像这样指定谓词时:

a -> a.isEmpty()

然后,另一种语法是String::isEmpty,它比前一种更可读。

但是在谓词的情况下,你需要调用一个或多个参数的方法,除了这个之外,你没有其他的方法来指定:a-

宗政小林
2023-03-14

在这种情况下,您不能用方法引用来表示它。如果您想使用迭代的当前元素作为另一个函数的参数,它将起作用。看看下面的例子:

final String str = "o";

final List<String> list = Arrays.asList("lorem", "ipsum", "dolor", "sit", "amet");
list.stream()
        .filter(it -> it.contains(str)) // (1)
        .filter(it -> str.contains(it)) // (2)
        .filter(str::contains)  // (3)
        .findFirst();

在这种情况下,(2)(3)是相等的,并且(1)表达了完全不同的表达式,不能用单个方法引用来表示。我希望它能有所帮助。

李辉
2023-03-14

您可以创建自己的谓词:

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);
 类似资料:
  • Obj.TestPredicate(list,String::Contains); 我在“String::Contains”中得到错误:不能从静态上下文引用非静态方法。但contains不是静态方法。我被那些小费弄糊涂了。 我的代码如下: (2)如果func是一个实例方法,那么someClass::func是一个lambda,它使用第一个参数作为实例,正如您所想的:(a,b,c)->a.func(

  • 使用Eclipse和Java-Version1.8 但这将只是打印stream对象,我如何能够访问stream中的所有项并打印每个项?

  • 更正:正如你们所指出的,我使用的是Java7。现在,方法就在那里。但问题仍然适用: 如何从字符串中获取?

  • 问题内容: 我必须将Java应用程序中的某些类反向工程为UML 2类图。到目前为止,到目前为止,我已经找到了如何代表Jon Skeet在此处表示的整个类的类模板:用UML表示模板类的正确方法是什么?。有了这些信息,我就对这样的类进行了反向工程: 现在,我遇到了一个难题,试图对只有一个方法包含通用参数的类进行逆向工程: 您知道如何实现任何UML 2工具吗?我只想了解这个概念。 问题答案: 我不知道如

  • 我有一个文本文件,其中包含几行由空格分隔的小整数列表。我要扫描第一行,并为第一行中的每个整数做一些事情。 所以我有一个扫描仪(textScan),它扫描文本文件的第一行,然后将其保存为String。然后我有了第二个扫描器,它扫描String来检查其中的值是否是整数。 但是 while 语句不允许我使用“行.has下一个Int”来扫描字符串!那么,我如何浏览字符串行以确定它是否有整数? 编辑:对不起

  • 问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才