我有一个给定的函数调用,java给了我一个错误,因为对象不能与int相比较(当然……)。有人能给我解释一下我需要改变什么吗?
我尝试用不同的方法对lambda表达式加括号,但没有得到任何有用的结果。我认为lambda表达式是正确的,filter-function是稍微错误的,但是我找不到我的错误……
// 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();
}
}我希望得到一个Optional.empty-Object,但我得到了一个java错误,因为v > 5对象v不能与int相比较。
发布于 2019-01-09 20:25:20
您必须使T成为一个可与int相媲美的包装类。例如:
IntStream.range(0, 10)
.filter(v -> v > 5)
.forEach(System.out::println);是可以的,因为v是一个int。
当T未知时,不能使用此表达式。
你可以做的是假设T必须是一个数字。
filter( v -> ((Number) v).doubleValue() > 5)但是,如果T是另一种类型,则会生成ClassCastExpection。
真正的解决方案是让T成为Number
例如:
class MyClass<T extends Number> {
public Optional<T> filter(Predicate<T> test) {或将其设置为特定类型,如int
class MyClass {
public IntOptional filter(IntPredicate test) {发布于 2019-01-09 20:24:48
在Java原语中,类型(例如int)和对象(例如Object)在类型层次结构中没有共同的祖先。正因为如此,谓词和其他流结构有两种风格,例如,在使用int时必须使用IntPredicate,在使用Object时必须使用Predicate。
编写过滤器函数的方法是使用OptionalInt和IntPredicate
public OptionalInt filter(IntPredicate tester) {
if (isPresent() && tester.test(get())) {
return ...
} else {
return OptionalInt.empty();
}
}发布于 2019-01-09 20:39:57
v -> v > 5可以有不同的含义。这取决于上下文。
(Object v) -> v > 5,因为>不能应用于Object:Stream.of("123",123).filter(v -> v>5);
(Integer v) -> v > 5,表示为了进行比较并返回结果,将执行取消装箱和自动装箱:Stream.of(123,123).filter(v -> v>5);
(int v) -> v > 5,这意味着它是IntPredicate的一个实例,在这里事情会很顺利:IntStream.of(123,123).filter(v -> v> 5);
https://stackoverflow.com/questions/54110063
复制相似问题