来自函数引用的谓词(布尔类型)
Predicate from Function Reference (of boolean type)
我需要使用基于布尔函数的谓词组合流操作。通过重新抛出方法的参数作为谓词找到了解决方法,如图所示:
public <T> Predicate<T> pred(final Predicate<T> aLambda) {
return aLambda;
}
public List<String> foo() {
return new ArrayList<String>().stream() //of course, this does nothing, simplified
.filter(pred(String::isEmpty).negate())
.collect(Collectors.toList());
}
'pred' 方法似乎什么都不做,但不是这样:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter((String::isEmpty).negate())
.collect(Collectors.toList());
}
也没有任何内联转换:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter(((Predicate)String::isEmpty).negate())
.collect(Collectors.toList());
}
似乎有效。失败并出现错误
The target type of this expression must be a functional interface
'pred(...)' 方法中发生了什么奇特的转换?
您可以使用
((Predicate<String>) String::isEmpty).negate()
(注意使用正确的泛型类型)
或(首选):
s -> !s.isEmpty()
这更简单易读。
你的第三个版本几乎成功了:
Arrays.<String>asList("Foo", "Bar", "").stream()
.filter(((Predicate<String>)String::isEmpty).negate())
.collect(Collectors.toList());
这似乎编译得很好。
你可以写一个实用方法:
class PredicateUtils {
public static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
}
并按如下方式使用它:
.filter(not(String::isEmpty))
我相信它比转换为 Predicate<T>
:
更具可读性
.filter(((Predicate<String>)String::isEmpty).negate())
尽管我会使用简单的 lambda:
s -> !s.isEmpty()
What the fancy conversion happens in the pred(...)
method?
您已指定上下文 - 要使用的类型。例如,String::isEmpty
可能是 Function<String, Boolean>
,或 Predicate<String>
,或我的 @FunctionalInterface
,或其他。
您明确表示您期待 Predicate<T>
,并且您会 return Predicate<T>
的一个实例。编译器现在能够确定您要使用的类型。
我需要使用基于布尔函数的谓词组合流操作。通过重新抛出方法的参数作为谓词找到了解决方法,如图所示:
public <T> Predicate<T> pred(final Predicate<T> aLambda) {
return aLambda;
}
public List<String> foo() {
return new ArrayList<String>().stream() //of course, this does nothing, simplified
.filter(pred(String::isEmpty).negate())
.collect(Collectors.toList());
}
'pred' 方法似乎什么都不做,但不是这样:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter((String::isEmpty).negate())
.collect(Collectors.toList());
}
也没有任何内联转换:
public List<String> foo() {
return new ArrayList<String>().stream()
.filter(((Predicate)String::isEmpty).negate())
.collect(Collectors.toList());
}
似乎有效。失败并出现错误
The target type of this expression must be a functional interface
'pred(...)' 方法中发生了什么奇特的转换?
您可以使用
((Predicate<String>) String::isEmpty).negate()
(注意使用正确的泛型类型)
或(首选):
s -> !s.isEmpty()
这更简单易读。
你的第三个版本几乎成功了:
Arrays.<String>asList("Foo", "Bar", "").stream()
.filter(((Predicate<String>)String::isEmpty).negate())
.collect(Collectors.toList());
这似乎编译得很好。
你可以写一个实用方法:
class PredicateUtils {
public static <T> Predicate<T> not(Predicate<T> predicate) {
return predicate.negate();
}
}
并按如下方式使用它:
.filter(not(String::isEmpty))
我相信它比转换为 Predicate<T>
:
.filter(((Predicate<String>)String::isEmpty).negate())
尽管我会使用简单的 lambda:
s -> !s.isEmpty()
What the fancy conversion happens in the
pred(...)
method?
您已指定上下文 - 要使用的类型。例如,String::isEmpty
可能是 Function<String, Boolean>
,或 Predicate<String>
,或我的 @FunctionalInterface
,或其他。
您明确表示您期待 Predicate<T>
,并且您会 return Predicate<T>
的一个实例。编译器现在能够确定您要使用的类型。