Python的生成器类似于Java

时间:2014-02-13 19:38:04

标签: java android python arraylist

我有python背景所以请允许我在python中使用我的代码。

在Java(Android)中有一个arrayList<customObject>。在每个customObject中对应一个布尔值(用于可见性)。

我希望尽可能高效地执行操作来检查可见性布尔值。在python中我会创建一个生成器。

假设我的架构是:

list = [{"item": customObject, "visible": boolean}, {...}, {...}]
visible_matches = [x for x in list if x['visible']] 

for match in visible_matches: 
    dosomething(match)

或替代架构:

list = [[ customObject, boolean], [...], [...]]
visible_matches = [x for x in list if x[1]]

我怎样才能在Java中执行相同的操作?

arrayList<arrayList<boolean,customObject>>arrayList< SimpleEntry<"item",customObject>, SimpleEntry<"visible",boolean> >

给我看一个非常脏的解决方案。有没有更简单的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

使用java.util.Map<CustomObject, Boolean>将对象映射到可见状态。

编辑获取地图中的所有可见项目:

Map<CustomObject, Boolean> items = ...;
List<CustomObject> visibleItems = new ArrayList<CustomObject>();

for (Map.Entry<CustomObject, Boolean> entry : items.entrySet()) {visibleItems
    CustomObject customObject = entry.getKey();
    Boolean objectVisible = entry.getValue();

    if (objectVisible) {
        visibleItems.add(customObject);
    }
}

我确实错过了Java中的闭包......

答案 1 :(得分:0)

Java没有与Python相同的生成器(迭代器不完全相同)。像在Python中一样动态创建自定义对象也不起作用。由于Java是强类型的,因此必须先定义自定义对象,然后才能使用它。 Python没有强类型。

在单独的文件中,尝试此启动代码。我命名为class MyCustomObject,因为它位于MyCustomObject.java中。名字必须匹配。

public class MyCustomObject {

    public boolean visible;

    // Constructor
    public MyCustomClass(boolean visible) {
        this.visible = visible;
    }

}

现在你有了一个自定义对象,你可以在主类中实例化和操作它。我打电话给我class Main,因为它再次出现在Main.java中。

public class Main {

    public static void main(String[] args) {

        ArrayList<MyCustomObject> list = new ArrayList<>();
        list.Add(new MyCustomObject(true));
        list.Add(new MyCustomObject(false));
        list.Add(new MyCustomObject(true));
        list.Add(new MyCustomObject(true));

        ....

        for (MyCustomObject potentialMatch: list) {
            if(obj.visible) 
                doSomething(potentialMatch);
        }
    }

}