Java v->;v>;5.
我有一个给定的函数调用,java给了我一个错误,因为对象与int不可比(当然…)。有人能给我解释一下我需要改变什么吗 我尝试以不同的方式支撑lambda表达式,但没有得到有用的结果。我认为,lambda表达式是正确的,而filter函数有点错误,但我无法找出我的错误Java v->;v>;5.,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有一个给定的函数调用,java给了我一个错误,因为对象与int不可比(当然…)。有人能给我解释一下我需要改变什么吗 我尝试以不同的方式支撑lambda表达式,但没有得到有用的结果。我认为,lambda表达式是正确的,而filter函数有点错误,但我无法找出我的错误 // function call filter(v -> v > 5) // function public Optional<T> filter(Predicate<T> tester) {
// function call
filter(v -> v > 5)
// function
public Optional<T> filter(Predicate<T> tester) {
if(isPresent() && tester.test(get())) {
return this;
} else {
return Optional.empty();
}
}
//函数调用
过滤器(v->v>5)
//作用
公共可选筛选器(谓词测试仪){
if(isPresent()&&tester.test(get()){
归还这个;
}否则{
返回可选的.empty();
}
}
我希望有一个可选的.empty-Object,但我得到了一个java错误,因为v>5
Object v在java原语类型(例如int
)和对象(例如Object
)中与int不可比,在类型层次结构中没有共同的祖先。由于谓词和其他流构造有两种风格,例如,在使用int
时必须使用的谓词和在使用对象时必须使用的谓词
编写过滤函数的方法是使用和IntPredicate
:
public OptionalInt filter(IntPredicate tester) {
if (isPresent() && tester.test(get())) {
return ...
} else {
return OptionalInt.empty();
}
}
您必须使T
成为一个与int相当的包装类
IntStream.range(0, 10)
.filter(v -> v > 5)
.forEach(System.out::println);
可以,因为v
是int
当t
未知时,不能使用此表达式
您可以做的是假设T
必须是一个数字,例如
filter( v -> ((Number) v).doubleValue() > 5)
但是,这将产生一个ClassCastExpection isT
是另一种类型
真正的解决办法是把T
aNumber
e、 g
我认为,lambda表达式是正确的
过滤函数有点错误,但我无法找到我的
错误
// function call
filter(v -> v > 5)
// function
public Optional<T> filter(Predicate<T> tester) {
if(isPresent() && tester.test(get())) {
return this;
} else {
return Optional.empty();
}
}
你说得对。
您的方法似乎无法满足为类声明的泛型类型,因为首先您的方法是在泛型类中定义的
假设您的类名为Foo
,这里的filter()
方法依赖于泛型T
类型作为返回/参数类型:
public class Foo<T>{
// ...
public Optional<T> filter(Predicate<T> tester) {
// ...
}
}
它将编译得很好,因为将从Foo
推断出Integer
所以我认为要解决您的问题,您应该声明Number或Integer作为泛型类型的基类:
public class Foo<T extends Integer>{
// ...
public Optional<T> filter(Predicate<T> tester) {
// ...
}
}
公共类Foo{
// ...
公共可选筛选器(谓词测试仪){
// ...
}
}
或者像前面的例子一样依赖于客户的推断 v->v>5
可以表示不同的含义。这取决于上下文
它可能是(对象v)->v>5
导致编译错误,因为
无法应用于对象
:
Stream.<Object>of("123", 123).filter(v -> v > 5);
它可能是一个(int v)->v>5
,这意味着它是的一个实例,在这里一切都会顺利进行:
IntStream.of(123, 123).filter(v -> v > 5);
注意:Predicate
whereT extends Number
就可以了。@PeterLawrey您完全正确,装箱是另一个选项。有没有办法在不更改函数头中的可选and谓词的情况下实现这一点?因为我真的不想使用公共可选过滤器(谓词测试仪)更改函数头..@PeterLawrey{
不幸的是,没有work@Hugugagegi您只能在声明它为第一个时间段时定义
,可能在类Xxxx
行上。查看完整的代码块也会很好。您在哪里使用过滤器
以及您试图推断的结果是什么?这是不可能的。您返回此
我这意味着你的类应该扩展Optional
,这是final
。你有自己的Optional
?这个类是泛型类。将v
转换为Number
并使用doubleValue()
使其与谓词兼容
看起来像是一种黑客行为。问题的根源在于:类中的T声明。
Stream.<Object>of("123", 123).filter(v -> v > 5);
Stream.<Integer>of(123, 123).filter(v -> v > 5);
IntStream.of(123, 123).filter(v -> v > 5);