我简化了我的问题。例如,在下面的代码片段中,carsList在开头是空的,listEmpty自然是真的。但是,在第一行之后,我在列表中添加了新项目并打印了结果。当carsList.isEmpty按预期返回false时,listEmpty Boolean的值未更改。
Boolean listEmpty = carsList.isEmpty(); //carsList.isEmpty() returns true
carsLists.add(car1);
System.out.println("ListEmpty: " + listEmpty + " CarsList.isEmpty:" + carsList.isEmpty); // ListEmpty: true CarsList.isEmpty: false
我需要一个类似别名的结构,它始终指向方法的最新结果。
alias = carsList.isEmpty(); //carsList.isEmpty() returns true
carsLists.add(car1);
System.out.println("Alias: " + alias + " CarsList.isEmpty:" + carsList.isEmpty); // Alias: false CarsList.isEmpty: false
当方法的结果发生变化时,别名结构的值应该相应地改变。
选择的解决方案不是我想要的,但它是最接近的。其他解决方案也很完美,可以在其他情况下使用。
答案 0 :(得分:2)
每次调用方法。 var obj = { foo: 'bar', baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
通常超级快,
更确切地说是O(1)。
如果你需要先调用很多函数来访问列表,"别名"而是列表:
isEmpty()
而不是
List<> myList = superLong().function().nesting().getList();
myList.isEmpty();
myList.isEmpty();
...
答案 1 :(得分:1)
private Boolean isListEmpty(){
return carsList.isEmpty()
}
使用此方法检查布尔条件,如
,而不是访问布尔变量System.out.println("Alias: " + isListEmpty() + " CarsList.isEmpty:" + carsList.isEmpty);
答案 2 :(得分:1)
使用Java 8,您可以使用Function
界面:
carsList.add(car1);
Function<List<?>, Boolean> empty = List::isEmpty;
System.out.println("ListEmpty: " + empty.apply(carsList) + " CarsList.isEmpty:" + carsList.isEmpty());
答案 3 :(得分:1)
您可以使用lambda返回Supplier实例。它的工作原理与通过引用方法调用的最新结果相同:
// note the final keyword
final List<...> list = ...
Supplier<Boolean> isEmpty = () -> list.isEmpty();
// now you can return it and use somewhere else
return isEmpty;
...
list.add(...);
...
System.out.println("Is list empty? " + isEmpty.get());
答案 4 :(得分:0)
然后你可能想要使用Observer模式。她是你如何使用它:https://www.tutorialspoint.com/design_pattern/observer_pattern.htm
答案 5 :(得分:0)
您可以使用本机使用观察者模式的Java的Reactive扩展来执行此操作:
https://github.com/ReactiveX/RxJava
在上面的示例中,您可以按照以下方式实现这些:
Observable oCarList = Observable.fromIterable(carList);
oCarList.subscribe(
new Consumer<Car>() {
@Override
void accept(Car car) {
//Method that executes when a car is added
System.out.println(car.toString());
}
}
)