Java中的别名结构

时间:2017-03-16 09:32:10

标签: java

我简化了我的问题。例如,在下面的代码片段中,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

当方法的结果发生变化时,别名结构的值应该相应地改变。

修改

选择的解决方案不是我想要的,但它是最接近的。其他解决方案也很完美,可以在其他情况下使用。

6 个答案:

答案 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());
      }
  }
)