什么相当于Rust的Java :: iter in Java?

时间:2014-12-13 17:39:51

标签: java rust

我在Rust中有以下代码,我想将其翻译成Java,所以我首先需要理解代码。

pub struct SimpleSelector {
    pub tag_name: Option<String>,
    pub id: Option<String>,
    pub class: Vec<String>,
}

impl Selector {
    pub fn specificity(&self) -> Specificity {
        // http://www.w3.org/TR/selectors/#specificity
        let Selector::Simple(ref simple) = *self;
        let a = simple.id.iter().len();
        let b = simple.class.len();
        let c = simple.tag_name.iter().len();
        (a, b, c)
    }
}

我在这行代码中面临问题:

let a = simple.id.iter().len();

2 个答案:

答案 0 :(得分:2)

如果Option<String>有一个值,那么它的迭代器将有一个要迭代的元素。

如果Option<String>没有值,那么它的迭代器将有0个要迭代的元素。

换句话说,a中的let a = simple.id.iter().len();simple.id中元素的数量,如果有id,则为1,如果没有,则为0。

([{1}}的实际计算发生在len,您可以看到它的来源here)。

如果是Java,您可以使用Item.size_hint,如

null
来自Java 8的

Optional,如

public class SimpleSelector {
  public String tag_name;
  public String id;
  public ArrayList<String> clazz;
}
// ...
int a = id == null ? 0 : 1;

答案 1 :(得分:2)

作为@ ArtemGr答案的补充,您还可以将Option视为只能包含0或1个值的集合。 Java代码可能如下所示:

public class SimpleSelector {
  public ArrayList<String> tag_name;
  public ArrayList<String> id;
  public ArrayList<String> clazz;
}
// ...
int a = id.size();

使用null会成为很多人的首选,但与Option相比,它有一个缺点。在Rust中,这永远不会编译:

fn thing(id: Option<String>) {
  id.len(); // id could be `Some` or `None`!
}

null - 在Java中使用等价物会编译但在运行时可能会爆炸:

public static void thing(String id) {
  id.length();  // id could be null or not-null!
}