“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)没有差异-
字符串包含
方法在本例中需要一个参数为“o”。
当我们指定谓词时,对字符串列表进行过滤时,通常的系统税是-
IntelliJ只在方法没有参数时给出建议。
例如当您像这样指定谓词时:
a -> a.isEmpty()
然后,另一种语法是String::isEmpty
,它比前一种更可读。
但是在谓词的情况下,你需要调用一个或多个参数的方法,除了这个之外,你没有其他的方法来指定:a-
在这种情况下,您不能用方法引用来表示它。如果您想使用迭代的当前元素作为另一个函数的参数,它将起作用。看看下面的例子:
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)
表达了完全不同的表达式,不能用单个方法引用来表示。我希望它能有所帮助。
您可以创建自己的谓词:
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。现在,方法就在那里。但问题仍然适用: 如何从字符串中获取?
我有一个文本文件,其中包含几行由空格分隔的小整数列表。我要扫描第一行,并为第一行中的每个整数做一些事情。 所以我有一个扫描仪(textScan),它扫描文本文件的第一行,然后将其保存为String。然后我有了第二个扫描器,它扫描String来检查其中的值是否是整数。 但是 while 语句不允许我使用“行.has下一个Int”来扫描字符串!那么,我如何浏览字符串行以确定它是否有整数? 编辑:对不起
问题内容: 我必须将Java应用程序中的某些类反向工程为UML 2类图。到目前为止,到目前为止,我已经找到了如何代表Jon Skeet在此处表示的整个类的类模板:用UML表示模板类的正确方法是什么?。有了这些信息,我就对这样的类进行了反向工程: 现在,我遇到了一个难题,试图对只有一个方法包含通用参数的类进行逆向工程: 您知道如何实现任何UML 2工具吗?我只想了解这个概念。 问题答案: 我不知道如
问题内容: 想知道有没有比如下计算给定字符串的字符数更简单的方法? 问题答案: 具有完全的Unicode支持(Java 11+)1的最简单的方法来计算字符串中每个字符的出现次数: 1)答案的结尾是具有完整Unicode支持的Java 8版本。 输出量 更新: 对于Java 8+(不支持补充平面中的字符,例如emoji): 更新2: 同样适用于Java 8+。 我误会了,以为它是在Java 9之前才